/ Hex Artifact Content
Login

Artifact ede1e65f465f6c507c876b87c3f796a7809b52bd9f82da14bac2680f5df8ebe6:


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: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
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 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9650: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9660: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9670: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9680: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9690: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96a0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96b0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96c0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96d0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
96e0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
96f0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9700: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9720: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9730: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9740: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9750: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9760: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9770: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9780: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9790: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97a0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97b0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97c0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97d0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
97e0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
97f0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9800: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9810: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9830: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9850: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9870: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9890: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98a0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
98e0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
98f0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9900: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9910: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9920: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9940: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9950: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9960: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9970: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9980: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9990: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99a0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99b0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99c0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99d0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
99e0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
99f0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a30: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a40: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a50: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a60: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a70: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9a80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9a90: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9aa0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ab0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ac0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9ad0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9ae0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9af0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b00: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b10: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b20: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b30: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b40: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b50: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b60: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b70: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9b80: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9b90: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9ba0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bb0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9bc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bd0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c00: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c20: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c30: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c50: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c60: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9c80: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9c90: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9ca0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cb0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9cc0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9ce0: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9cf0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d00: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d10: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d20: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d30: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d50: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d60: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9d80: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9d90: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9da0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9db0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9dc0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9dd0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9de0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9df0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e10: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e30: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e70: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9e80: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9e90: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ea0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9eb0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ec0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ed0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9ee0: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9ef0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f00: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f10: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f20: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f30: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f40: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f50: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f60: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f70: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9f80: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9f90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fa0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fb0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fc0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9fd0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9fe0: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ff0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a010: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a030: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a040: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a050: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a060: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a070: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a080: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a090: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0a0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0c0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a0e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a0f0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a110: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a120: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a130: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a140: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a150: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a160: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a170: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a180: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a190: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1a0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1b0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1c0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1d0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a1e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a1f0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a200: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a210: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a230: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a240: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a250: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a260: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a270: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a280: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a290: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2a0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2b0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a2e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a310: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a320: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a330: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a340: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a350: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a360: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3d0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a3e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a400: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a410: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a420: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a430: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a450: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a460: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a470: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4a0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a4e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a510: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a520: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a540: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a550: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a570: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a580: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a590: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5b0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a600: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a610: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a620: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a630: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a640: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a660: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a670: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a690: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6a0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6b0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6c0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6d0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a6e0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a6f0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a700: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a710: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a720: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a740: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a760: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a770: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a780: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a790: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a7e0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a820: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a850: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a860: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a870: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a880: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a890: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8f0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a900: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a920: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a930: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a940: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a950: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a960: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a970: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a980: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a990: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a9f0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa10: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa30: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa40: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa60: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa70: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aa80: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aa90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aaa0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aac0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aad0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
aae0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aaf0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab10: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab20: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab60: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab70: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab80: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ab90: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
aba0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abb0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abc0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abd0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
abf0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac00: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac10: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac20: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac30: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac40: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac50: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac60: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac70: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ac80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ac90: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
aca0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
acc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acd0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ace0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
acf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad00: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad10: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad20: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad40: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad50: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ad80: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ad90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ada0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
adb0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
adc0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
add0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ade0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
adf0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae10: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae30: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae50: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae60: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae70: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
ae80: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
ae90: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aea0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aec0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aed0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
aee0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
aef0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af00: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af10: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af20: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af30: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af40: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af50: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af60: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
af80: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
af90: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afa0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afb0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afc0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
afd0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
afe0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
aff0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b000: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b010: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b020: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b030: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b040: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b050: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b060: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b070: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b080: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0a0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0b0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0c0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b0e0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b0f0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b100: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b110: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b120: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b130: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b140: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b150: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b160: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b170: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b180: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b190: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1a0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1d0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b1e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b1f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b200: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b210: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b220: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b230: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b240: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b250: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b260: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b270: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b280: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b290: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2a0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2d0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b2e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b2f0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b300: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b310: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b320: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b330: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b340: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b350: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b360: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b370: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b380: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3a0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3b0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3e0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b3f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b400: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b410: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b420: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b440: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b450: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b460: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b470: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b480: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b490: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4a0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4b0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b4e0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b4f0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b500: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b510: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b520: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b530: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b540: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b560: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b570: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b580: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b590: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5b0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5d0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b5e0: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b5f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b600: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b610: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b620: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b630: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b640: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b650: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b670: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b680: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b690: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6a0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6c0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b6e0: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b6f0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b700: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b720: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b730: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b740: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b750: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b760: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b770: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b780: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b790: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7a0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7b0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7d0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b7e0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b800: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b810: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b820: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b830: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b840: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b850: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b870: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b880: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b890: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8a0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8b0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8c0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8d0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b8e0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b8f0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b900: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b910: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b920: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b930: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b940: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b950: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b960: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b970: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b980: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b990: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9a0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9b0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9c0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b9e0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b9f0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba20: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba60: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba70: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
ba80: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
ba90: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
baa0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bab0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bac0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
baf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb20: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bb80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bb90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bba0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbb0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbc0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbd0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bbf0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc00: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc20: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc30: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc40: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc70: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bc80: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bc90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bca0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcb0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bcc0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bcf0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd00: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd10: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd20: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd30: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd40: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd50: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bd80: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bd90: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdb0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bdc0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdd0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
bde0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bdf0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be00: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be10: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be20: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be50: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
be80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
be90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bea0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
beb0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bec0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bed0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bee0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bef0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf00: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf10: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf30: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf40: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf50: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bf80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bf90: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfa0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfb0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfc0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bfd0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
bfe0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
bff0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c000: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c010: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c020: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c030: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c040: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c050: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c060: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c070: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c080: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c090: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0b0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0c0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0d0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c0e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c0f0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c100: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c140: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c150: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c160: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c170: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c180: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c190: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c1f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c200: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c210: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c220: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c230: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c240: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c250: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c260: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c270: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c280: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c290: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2a0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2c0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2d0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c310: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c320: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c330: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c340: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c350: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c360: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c370: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c380: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c390: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3a0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3b0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3c0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3d0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c3e0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c3f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c400: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c410: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c420: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c430: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c440: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c450: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c460: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c470: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c480: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c490: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4c0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4d0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c4e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c4f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c500: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c510: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c520: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c530: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c540: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c550: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c560: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c570: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c590: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5a0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c5f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c600: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c610: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c620: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c630: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c640: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c650: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c660: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c680: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c690: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6c0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6d0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c6e0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c6f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c700: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c710: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c720: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c730: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c740: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c750: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c760: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c770: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c780: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c790: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c7e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c7f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c800: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c810: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c820: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c830: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c840: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c850: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c860: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c870: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c880: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c890: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8b0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8d0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c8e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c8f0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c900: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c910: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c920: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c930: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c940: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c950: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c960: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c970: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9a0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
c9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c9f0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca10: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca20: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca50: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca60: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ca80: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
caa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cac0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
cad0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cae0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
caf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb00: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb10: 20 69 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49   if( dc&SQLITE_I
cb20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
cb30: 43 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  C ){.    return 
cb40: 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
cb50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cb60: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
cb70: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  E.  {.    int nS
cb80: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
cb90: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
cba0: 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
cbb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
cbc0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
cbd0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
cbe0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
cbf0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
cc00: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
cc10: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
cc20: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
cc30: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
cc40: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
cc50: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
cc60: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
cc70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
cc80: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
cc90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
cca0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
ccb0: 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a  pPager);.#endif.
ccc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ccd0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
cce0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
ccf0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
cd00: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
cd10: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
cd20: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
cd30: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
cd40: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
cd50: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
cd60: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
cd70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
cd80: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
cd90: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
cda0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
cdb0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
cdc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
cdd0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
cde0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
cdf0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
ce00: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
ce10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
ce20: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
ce30: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
ce40: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
ce50: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
ce60: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
ce70: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
ce80: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
ce90: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
cea0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
ceb0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
cec0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
ced0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
cee0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
cef0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
cf00: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
cf10: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
cf20: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
cf30: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
cf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
cf50: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
cf60: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
cf70: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
cf80: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
cf90: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
cfa0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
cfb0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
cfc0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
cfd0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
cfe0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
cff0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
d000: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
d010: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
d020: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
d030: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
d040: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
d050: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
d060: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
d070: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d080: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
d090: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d0a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
d0b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
d0c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
d0d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
d0e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
d0f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
d100: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
d110: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
d120: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
d130: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
d140: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
d150: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
d160: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
d170: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
d180: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
d190: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
d1a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
d1b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
d1c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
d1d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
d1e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
d1f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
d200: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
d210: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d220: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
d230: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
d240: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
d250: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
d260: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
d270: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
d280: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
d290: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
d2a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
d2b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
d2c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
d2d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
d2e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
d2f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
d300: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
d310: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
d320: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
d330: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
d340: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
d350: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
d360: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
d370: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
d380: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
d390: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
d3a0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
d3b0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
d3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d3d0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
d3e0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
d3f0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
d400: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
d410: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
d420: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
d430: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
d440: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
d450: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
d460: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d470: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
d480: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
d490: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
d4a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d4b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d4c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d4d0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
d4e0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
d4f0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
d500: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
d510: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
d520: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
d530: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
d540: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
d550: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
d560: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
d570: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
d580: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
d590: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
d5a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d5b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d5c0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
d5d0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
d5e0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
d5f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
d600: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d610: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
d620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d630: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
d640: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d650: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
d660: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
d670: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
d680: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
d690: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
d6a0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
d6b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d6c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d6d0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
d6e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d6f0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
d700: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
d710: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d720: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d740: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
d750: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
d760: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
d770: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
d780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d790: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
d7a0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
d7b0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d7e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d7f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d800: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d810: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d820: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d830: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d840: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d850: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d860: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d870: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d880: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d890: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d8a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d8b0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d8c0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d8d0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d8e0: 6c 65 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c  len>szJ-16.   ||
d8f0: 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53   len==0 .   || S
d900: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d910: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d920: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
d930: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
d940: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d950: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
d960: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
d970: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
d980: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
d990: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
d9a0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d9b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d9c0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
d9d0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
d9e0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
d9f0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
da00: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
da10: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
da20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
da30: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
da40: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
da50: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
da60: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
da70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
da80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
da90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
daa0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
dab0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
dac0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
dad0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
dae0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
daf0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
db00: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
db10: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
db20: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
db30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
db40: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
db50: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
db60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
db70: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
db80: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
db90: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
dba0: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
dbb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dbc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dbd0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
dbe0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
dbf0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
dc00: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
dc10: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
dc20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
dc30: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
dc40: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
dc50: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
dc60: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
dc70: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
dc80: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
dc90: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
dca0: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
dcb0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dce0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
dd30: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
dd40: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
dd50: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
dd70: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
dd80: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
dd90: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
dda0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
ddb0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
ddc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ddd0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
dde0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
ddf0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
de00: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
de10: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
de20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
de30: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
de40: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
de50: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
de60: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
de70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
de80: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
de90: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dea0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
deb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
dec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
ded0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
dee0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
def0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
df00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
df10: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
df20: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
df30: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
df40: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
df50: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
df60: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
df70: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
df80: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
df90: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
dfa0: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
dfb0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
dfc0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
dfd0: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
dfe0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
dff0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
e000: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
e010: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
e020: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
e030: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
e040: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
e050: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
e060: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
e070: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
e080: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e090: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
e0a0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
e0b0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
e0c0: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
e0d0: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
e0e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
e0f0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
e100: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
e110: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
e120: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
e130: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
e140: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
e150: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
e160: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
e170: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
e180: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
e190: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
e1a0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
e1b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e1c0: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
e1d0: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
e1e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e1f0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
e200: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
e210: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
e220: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
e230: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
e240: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
e250: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
e260: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
e270: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
e280: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
e290: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
e2a0: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
e2b0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e2c0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
e2d0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
e2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e310: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
e320: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e330: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
e340: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f  sert( !sqlite3Jo
e350: 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
e360: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
e370: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
e380: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
e390: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
e3a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e3b0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
e3c0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
e3d0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
e3e0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
e3f0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
e400: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
e410: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
e420: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e430: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
e440: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
e450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e460: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e470: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
e480: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
e490: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
e4a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
e4b0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
e4c0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
e4d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
e4e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
e4f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
e500: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e510: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
e520: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
e530: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
e540: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
e550: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
e560: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
e570: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
e580: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
e590: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
e5a0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
e5b0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
e5c0: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
e5d0: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
e5e0: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
e5f0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
e600: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
e610: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
e620: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
e630: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
e640: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
e650: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
e660: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
e670: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
e680: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
e690: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
e6a0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
e6b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
e6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
e6d0: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
e6e0: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
e6f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
e700: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
e710: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
e720: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e730: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
e740: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e750: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
e760: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
e770: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
e780: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e790: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
e7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
e7b0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
e7c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e7d0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
e7e0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
e7f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
e800: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
e810: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e820: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
e830: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
e840: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
e850: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
e860: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
e870: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
e880: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
e890: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
e8a0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
e8b0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
e8c0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
e8d0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
e8e0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
e8f0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e900: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e910: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e920: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e930: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e940: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
e950: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
e960: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
e970: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
e980: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
e990: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
e9a0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
e9b0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
e9c0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
e9d0: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
e9e0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
e9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea00: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
ea10: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ea20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ea30: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
ea40: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ea50: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
ea60: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
ea70: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
ea80: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
ea90: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
eaa0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
eab0: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
eac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
ead0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
eae0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
eaf0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
eb00: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb20: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
eb30: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
eb40: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
eb70: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
eb80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
eb90: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
eba0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
ebb0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
ebc0: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
ebd0: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
ebe0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
ebf0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
ec00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ec10: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
ec20: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
ec30: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
ec40: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
ec50: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
ec60: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
ec70: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
ec80: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ec90: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
eca0: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
ecb0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
ecc0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
ecd0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ece0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
ecf0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
ed00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ed10: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
ed20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
ed30: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ed40: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
ed50: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ed60: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
ed70: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ed80: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
ed90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
eda0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
edb0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
edc0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
edd0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
ede0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
edf0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
ee00: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
ee10: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
ee20: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
ee30: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
ee40: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
ee50: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
ee60: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
ee70: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
ee80: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
ee90: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
eea0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
eeb0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
eec0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
eed0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
eee0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
eef0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
ef00: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
ef10: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
ef20: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
ef30: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
ef40: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
ef50: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
ef60: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
ef70: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
ef80: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
ef90: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
efa0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
efb0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
efc0: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
efd0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
efe0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
eff0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
f000: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
f010: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
f020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
f030: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
f040: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
f050: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
f060: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
f070: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
f080: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
f090: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
f0a0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f0b0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
f0c0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
f0d0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
f0e0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
f0f0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
f100: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
f110: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
f120: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
f130: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
f140: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
f150: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
f160: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
f170: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
f180: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
f190: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
f1a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
f1b0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
f1c0: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
f1d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
f1e0: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
f1f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
f200: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
f210: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
f220: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
f230: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
f240: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
f250: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
f260: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
f270: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
f280: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
f290: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f2a0: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
f2b0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f2c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f2d0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
f2e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
f2f0: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
f300: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
f310: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
f320: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
f330: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
f340: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
f350: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
f360: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
f370: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
f380: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f390: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
f3a0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f3b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
f3c0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
f3d0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
f3e0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
f3f0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
f400: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f410: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f420: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
f430: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
f440: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
f450: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
f460: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
f470: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f480: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f490: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
f4a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
f4b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
f4c0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
f4d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f4e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f4f0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
f500: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
f510: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
f520: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
f530: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
f540: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
f550: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
f560: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
f570: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
f580: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
f590: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
f5a0: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
f5b0: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
f5c0: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
f5d0: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
f5e0: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
f5f0: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
f600: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
f610: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
f620: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f630: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
f640: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
f650: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f660: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
f670: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
f680: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
f690: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
f6a0: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
f6b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
f6c0: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
f6d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
f6e0: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
f6f0: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
f700: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
f710: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
f720: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
f730: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
f740: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
f750: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
f760: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
f770: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
f780: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
f790: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
f7a0: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
f7b0: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
f7c0: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
f7d0: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
f7e0: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
f7f0: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
f800: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
f810: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
f820: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
f830: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
f840: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
f850: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
f860: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
f870: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
f880: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
f890: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
f8a0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
f8b0: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
f8c0: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
f8d0: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
f8e0: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
f8f0: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f900: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f910: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f920: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f930: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f940: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
f950: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
f960: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
f970: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
f980: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
f990: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
f9a0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
f9b0: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
f9c0: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
f9d0: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
f9e0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
f9f0: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
fa00: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
fa10: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
fa20: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
fa30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fa40: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
fa50: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
fa60: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
fa70: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
fa80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa90: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
faa0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fab0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
fac0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
fad0: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
fae0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
faf0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
fb00: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
fb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb20: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
fb30: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
fb40: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
fb50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fb60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
fb70: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
fb80: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
fb90: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
fba0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
fbb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fbc0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
fbd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
fbe0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
fbf0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
fc00: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
fc10: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
fc20: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
fc30: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
fc40: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
fc50: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
fc60: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
fc70: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
fc80: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
fc90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fca0: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
fcb0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
fcc0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
fcd0: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
fce0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
fcf0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
fd00: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
fd10: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
fd20: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
fd30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
fd40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
fd50: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
fd60: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
fd70: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
fd80: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
fd90: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
fda0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
fdb0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fdc0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
fdd0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
fde0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
fdf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fe00: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
fe10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
fe20: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
fe30: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
fe40: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
fe50: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
fe60: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
fe70: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
fe80: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
fe90: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
fea0: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
feb0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
fec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
fed0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
fee0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff00: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
ff10: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
ff20: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff40: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
ff50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
ff60: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
ff70: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
ff80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
ff90: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
ffa0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
ffb0: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
ffc0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
ffd0: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
ffe0: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
fff0: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
10000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10030 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
10040 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
10050 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
10060 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
10070 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
10080 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100a0 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
100b0 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
100c0 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
100d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
100e0 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
100f0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
10100 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
10110 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
10120 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
10130 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10140 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
10150 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
10160 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
10170 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
10180 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
10190 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
101a0 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
101b0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
101c0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
101d0 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
101e0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
101f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
10210 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10220 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
10230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10240 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
10250 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10270 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
10280 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
10290 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
102a0 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
102b0 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
102c0 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
102d0 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
102e0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
102f0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
10300 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
10310 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
10320 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
10330 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10340 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
10350 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
10360 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
10370 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
10380 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
10390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
103a0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
103b0 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
103c0 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
103d0 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
103e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
103f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
10400 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
10410 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
10420 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
10430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
10440 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10450 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10460 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
10470 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
10480 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
10490 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
104a0 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
104b0 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
104c0 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
104d0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
104e0 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
104f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10500 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
10510 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
10520 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
10530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
10540 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10550 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10560 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
10570 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
10580 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10590 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
105a0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
105b0 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
105c0 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
105d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
105e0 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
105f0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10600 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
10610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
10630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10640 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
10650 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
10660 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
10670 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10680 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
10690 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
106a0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
106b0 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
106c0 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
106d0 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
106e0 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
106f0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10700 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
10710 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
10720 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10730 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10740 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10750 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
10760 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
10770 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
10780 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10790 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
107a0 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
107b0 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
107c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
107d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
107e0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
107f0 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
10800 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
10810 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
10820 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
10830 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
10840 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
10850 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
10860 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
10870 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
10880 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
10890 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
108a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
108b0 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
108c0 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
108d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
108e0 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
108f0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
10900 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
10910 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
10920 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10930 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
10940 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
10950 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
10960 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
10970 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
10980 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
10990 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
109a0 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
109b0 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
109c0 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
109d0 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
109e0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
109f0 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10a00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10a10 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10a20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10a30 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
10a40 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
10a50 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10a60 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
10a70 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
10a80 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
10a90 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
10aa0 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
10ab0 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
10ac0 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
10ad0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10ae0 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
10af0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10b00 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10b10 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10b20 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10b30 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
10b40 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
10b50 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
10b60 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
10b70 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
10b80 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
10b90 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
10ba0 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
10bb0 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
10bc0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10bd0 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
10be0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10bf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10c00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10c10 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10c20 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10c30 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
10c40 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
10c50 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
10c60 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
10c70 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
10c80 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
10c90 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
10ca0 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
10cb0 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
10cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10cd0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10ce0 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
10cf0 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10d00 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10d10 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10d20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10d30 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
10d40 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
10d50 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
10d60 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
10d70 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
10d80 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
10d90 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
10da0 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
10db0 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
10dc0 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
10dd0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
10de0 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
10df0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10e00 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10e10 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10e20 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10e30 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
10e40 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
10e50 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
10e60 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
10e70 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
10e80 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
10e90 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
10ea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10eb0 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
10ec0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10ee0 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
10ef0 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10f00 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10f20 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10f30 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
10f40 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
10f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10f60 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
10f70 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
10f80 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
10f90 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
10fa0 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
10fb0 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
10fc0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
10fd0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
10fe0 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
10ff0 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
11000 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
11010 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
11020 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
11030 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
11040 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
11050 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
11060 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
11070 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
11080 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
11090 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
110a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
110b0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
110c0 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
110d0 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
110e0 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
110f0 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
11100 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
11110 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
11120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
11130 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
11140 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
11150 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
11160 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
11170 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
11180 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
11190 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
111a0 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
111b0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
111c0 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
111d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
111e0 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
111f0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
11200 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
11210 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
11220 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
11230 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
11240 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
11250 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
11260 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
11270 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11290 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
112a0 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
112d0 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
112e0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
11310 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
11320 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
11330 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11350 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
11360 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
11370 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
113a0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
113b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
113c0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
113d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
113e0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
113f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
11400 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
11410 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11420 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
11430 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
11440 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
11450 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
11460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11470 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
11480 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
11490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
114a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
114b0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
114c0 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
114d0 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
114e0 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
114f0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
11500 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
11510 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
11520 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
11530 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
11540 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
11550 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
11560 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
11570 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
11580 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
11590 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
115a0 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
115b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
115c0 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
115d0 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
115e0 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
115f0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
11600 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
11610 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
11620 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
11630 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
11640 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11650 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
11660 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
11670 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
11680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11690 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
116a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
116b0 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
116c0 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
116d0 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
116e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
116f0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
11700 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
11710 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
11720 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11730 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11740 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
11750 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
11760 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
11770 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11780 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11790 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
117a0 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
117b0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
117c0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
117d0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
117e0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
117f0 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
11800 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
11810 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
11820 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
11830 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
11840 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
11850 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
11860 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
11870 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
11880 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20  c, 8,.          
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34         iHdrOff+4
118b0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
118c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
118d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
118e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
118f0 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
11900 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11910 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
11920 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
11930 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
11940 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
11950 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
11960 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
11970 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11980 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
11990 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
119a0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
119b0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
119c0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
119d0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
119e0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
119f0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11a00 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
11a10 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
11a20 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
11a30 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
11a40 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11a50 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
11a60 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
11a70 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
11a80 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
11a90 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
11aa0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
11ab0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
11ac0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
11ad0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
11ae0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
11af0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
11b00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11b10 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
11b20 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
11b30 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
11b40 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
11b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11b60 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11b70 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11b80 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
11b90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ba0 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
11bb0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11bc0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
11bd0 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
11be0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11bf0 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
11c00 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72  Pager){.  pPager
11c10 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
11c20 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  ;.  sqlite3Backu
11c30 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
11c40 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
11c50 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
11c60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
11c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11c80 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44  n the pPager->iD
11c90 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65  ataVersion value
11ca0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50  .*/.u32 sqlite3P
11cb0 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28  agerDataVersion(
11cc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11ce0 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
11cf0 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  PEN );.  return 
11d00 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11d10 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11d20 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11d30 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11d40 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11d50 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11d60 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11d70 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11d80 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11d90 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11da0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11db0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11dc0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11dd0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11de0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11df0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11e00 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11e10 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e30 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
11e40 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
11e50 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
11e60 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11e70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11e80 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11e90 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11ea0 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11eb0 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
11ec0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
11ed0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11ee0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
11ef0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
11f00 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
11f10 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
11f20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
11f30 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
11f40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
11f50 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
11f60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
11f70 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11f80 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11f90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11fa0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
11fb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
11fc0 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
11fd0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
11fe0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
11ff0 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
12000 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
12010 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
12020 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
12030 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
12040 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
12050 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
12060 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12070 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
12080 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12090 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
120a0 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
120d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
120e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
120f0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
12100 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
12110 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
12120 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
12130 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
12140 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
12150 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
12160 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
12170 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
12180 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12190 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
121a0 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
121b0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
121c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
121d0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
121e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
121f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12230 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
12240 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12250 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
12260 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
12270 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
12280 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
12290 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
122a0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
122b0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
122c0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
122d0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
122e0 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
122f0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
12300 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
12310 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
12320 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
12330 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12340 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
12350 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
12360 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
12370 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
12380 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
12390 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
123a0 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
123b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
123c0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
123d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
123e0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
123f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
12400 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
12410 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
12420 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
12430 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
12440 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
12450 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
12460 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12470 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
12480 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
12490 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
124a0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
124b0 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
124c0 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
124d0 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
124e0 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
124f0 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
12500 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
12510 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
12520 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
12530 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
12540 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
12550 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
12560 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
12570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
12580 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
12590 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
125a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
125b0 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
125c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
125d0 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
125e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
125f0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
12600 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
12610 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
12620 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
12630 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
12640 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
12650 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12660 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12670 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12680 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12690 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
126a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
126b0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
126c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
126d0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
126e0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
126f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
12700 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
12730 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
12740 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
12750 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12760 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12770 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12780 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12790 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
127a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
127b0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
127c0 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
127d0 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
127e0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
127f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
12800 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
12810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
12820 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
12830 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
12840 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
12850 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12860 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12870 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12880 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
128a0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
128b0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
128c0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
128d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
128e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
128f0 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12900 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12910 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
12920 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
12930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12940 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12950 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12960 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12970 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12980 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12990 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
129a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
129b0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
129c0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
129d0 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
129e0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
129f0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
12a00 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
12a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
12a20 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
12a30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12a40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
12a50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12a60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12a70 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12a80 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12a90 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12aa0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12ab0 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12ac0 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12ad0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12ae0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12af0 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
12b00 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
12b10 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
12b20 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
12b30 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
12b40 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
12b50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12b60 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12b70 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b90 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12ba0 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12bb0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12bc0 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12bd0 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12be0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12bf0 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
12c00 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
12c10 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
12c20 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
12c30 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
12c40 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
12c50 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12c60 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12c70 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12c80 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12c90 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12ca0 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12cb0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12cc0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12cd0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12ce0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12cf0 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
12d00 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12d10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
12d20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12d30 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
12d40 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
12d50 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12d60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12d70 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12d80 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12d90 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12da0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12db0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12dc0 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12dd0 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12de0 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12df0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
12e00 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
12e10 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
12e20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
12e30 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
12e40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12e50 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12e60 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
12e70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12e80 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12e90 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
12ea0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
12eb0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12ec0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
12ed0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12ee0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  one = 0;.      p
12ef0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12f00 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
12f20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69  ger->eState = (i
12f30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
12f40 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20  d) ? PAGER_OPEN 
12f50 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b  : PAGER_READER);
12f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55  .    }.    if( U
12f70 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
12f80 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
12f90 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
12fa0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
12fb0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
12fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65  TE_OK;.    setGe
12fd0 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
12fe0 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  r);.  }..  pPage
12ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13000 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
13010 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
13020 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13030 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
13040 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13050 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
13060 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
13070 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
13080 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
13090 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
130a0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
130b0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
130c0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
130d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
130e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
130f0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
13100 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
13110 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
13120 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
13130 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
13140 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
13150 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
13160 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
13170 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
13180 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
13190 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
131a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
131b0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
131c0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
131d0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
131e0 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
131f0 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
13200 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
13210 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
13220 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
13230 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
13240 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
13250 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
13260 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
13270 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
13280 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
13290 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
132a0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
132b0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
132c0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
132d0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
132e0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
132f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
13300 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
13310 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
13320 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
13330 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
13340 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
13350 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
13360 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
13370 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
13380 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
13390 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
133a0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
133b0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
133c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
133d0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
133e0 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
133f0 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
13400 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
13410 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
13420 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
13430 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
13440 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13450 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
13460 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
13470 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
13480 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
13490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
134a0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
134b0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
134c0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
134d0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
134e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
134f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
13500 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
13510 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
13520 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
13530 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
13540 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
13550 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
13560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
13570 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
13580 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
13590 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20  PAGER_ERROR;.   
135a0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
135b0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
135c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
135d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
135e0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
135f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
13600 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  e);../*.** The w
13610 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
13620 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20   open on pPager 
13630 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
13640 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a  ed (bCommit==1).
13650 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ** or rolled bac
13660 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a  k (bCommit==0)..
13670 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
13680 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  E if and only if
13690 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
136a0 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68   should be flush
136b0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
136c0 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  * Rules:.**.**  
136d0 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50   *  For non-TEMP
136e0 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61   databases, alwa
136f0 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e  ys sync to disk.
13700 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
13710 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20  ary.**      for 
13720 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20  transactions to 
13730 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a  be durable..**.*
13740 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50  *   *  Sync TEMP
13750 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f   database only o
13760 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20  n a COMMIT (not 
13770 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e  a ROLLBACK) when
13780 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20   the backing.** 
13790 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65       file has be
137a0 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61  en created alrea
137b0 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20  dy (via a spill 
137c0 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29  on pagerStress()
137d0 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68  ) and.**      wh
137e0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
137f0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
13800 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32  memory exceeds 2
13810 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a  5% of the total.
13820 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69  **      cache si
13830 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
13840 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  t pagerFlushOnCo
13850 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
13860 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13870 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
13880 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65  tempFile==0 ) re
13890 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62  turn 1;.  if( !b
138a0 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20  Commit ) return 
138b0 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  0;.  if( !isOpen
138c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
138d0 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
138e0 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65  n (sqlite3PCache
138f0 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61  PercentDirty(pPa
13900 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32  ger->pPCache)>=2
13910 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  5);.}../*.** Thi
13920 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
13930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
13940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
13950 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
13960 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
13970 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
13980 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
13990 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
139a0 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
139b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
139c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
139d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
139e0 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
139f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13a00 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
13a10 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
13a20 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
13a30 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
13a40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
13a50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13a60 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
13a70 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
13a80 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
13a90 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
13aa0 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
13ab0 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
13ac0 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
13ad0 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
13ae0 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
13af0 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
13b00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
13b10 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
13b20 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
13b30 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
13b40 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13b50 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
13b60 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
13b70 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
13b80 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
13b90 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
13ba0 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
13bb0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
13bc0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
13bd0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
13be0 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
13bf0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
13c00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
13c10 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
13c20 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
13c30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
13c40 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
13c50 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
13c60 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
13c70 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13c80 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13c90 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13ca0 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
13cb0 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
13cc0 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
13cd0 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
13ce0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
13cf0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
13d00 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
13d10 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
13d20 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
13d30 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
13d40 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
13d50 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13d60 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
13d70 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
13d80 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
13d90 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
13da0 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
13db0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
13dc0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13dd0 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
13de0 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
13df0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13e00 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
13e10 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
13e20 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
13e30 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
13e40 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
13e50 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
13e60 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
13e70 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
13e80 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
13e90 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
13ea0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
13eb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
13ec0 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
13ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
13ee0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
13ef0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
13f00 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
13f10 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
13f20 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
13f30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
13f40 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
13f50 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
13f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13f70 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
13f80 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
13f90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
13fa0 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
13fb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
13fc0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
13fd0 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
13fe0 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
13ff0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14000 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
14010 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
14020 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
14030 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
14040 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
14050 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
14060 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
14070 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
14080 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
14090 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
140a0 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
140b0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
140c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
140d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
140e0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
140f0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
14100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
14110 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
14120 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
14130 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
14140 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14150 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
14160 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
14170 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14180 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
14190 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
141a0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
141b0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
141c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
141d0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
141e0 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
141f0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
14200 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
14210 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
14220 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
14230 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14240 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
14250 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
14260 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
14270 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
14280 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
14290 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
142a0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
142b0 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
142c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
142d0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
142e0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
142f0 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
14300 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ter, int bCommit
14310 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14320 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
14330 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14340 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
14350 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
14360 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  */.  int rc2 = S
14370 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
14380 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14390 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20   db file unlock 
143a0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
143b0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
143c0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
143d0 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  not have an open
143e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
143f0 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65  on.  ** or at le
14400 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
14410 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ock. This functi
14420 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
14430 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a   when there.  **
14440 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
14450 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20  nsaction active 
14460 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f  but a RESERVED o
14470 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
14480 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65  s.  ** held unde
14490 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  r two circumstan
144a0 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ces:.  **.  **  
144b0 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63   1. After a succ
144c0 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e  essful hot-journ
144d0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
144e0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20  is called with. 
144f0 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d   **      eState=
14500 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20  =PAGER_NONE and 
14510 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
14520 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  _LOCK..  **.  **
14530 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65     2. If a conne
14540 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69  ction with locki
14550 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14560 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
14570 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20  LUSIVE .  **    
14580 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20    lock switches 
14590 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f  back to locking_
145a0 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20  mode=normal and 
145b0 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a  then executes a.
145c0 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74    **      read-t
145d0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
145e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
145f0 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d  led with eState=
14600 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
14610 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f   **      and eLo
14620 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
14630 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  CK when the read
14640 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
14650 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  closed..  */.  a
14660 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14670 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14680 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
14690 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
146a0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
146b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
146c0 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f  te<PAGER_WRITER_
146d0 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72  LOCKED && pPager
146e0 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44  ->eLock<RESERVED
146f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
14700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14710 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   }..  releaseAll
14720 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
14730 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r);.  assert( is
14740 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14750 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
14760 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20  Journal==0 .    
14770 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
14780 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14790 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
147a0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
147b0 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b  TCH_ATOMIC).  );
147c0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
147d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
147e0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
147f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
14800 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
14810 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14820 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
14830 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14840 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14850 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14860 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
14870 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14880 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14890 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
148a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
148b0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
148c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
148d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
148e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
148f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
14900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
14910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14960 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14970 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14990 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
149a0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
149b0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
149c0 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
149d0 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
149e0 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
149f0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
14a00 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
14a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
14a20 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
14a30 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
14a40 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14a50 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14a60 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14a70 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14a80 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14a90 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14aa0 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14ab0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14ac0 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14ad0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14ae0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14af0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14b00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
14b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14b20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14b60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14b70 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14b80 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14b90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14bb0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14bc0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14be0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
14bf0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
14c00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14c10 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14c20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14c40 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14c50 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14c60 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14c70 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14c80 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14c90 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14ca0 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14cb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14cc0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14cd0 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14ce0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14cf0 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
14d00 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
14d10 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
14d20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
14d30 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
14d40 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14d50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14d60 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14d70 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14d80 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14d90 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14da0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14db0 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14de0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14df0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14e00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14e20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14e30 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
14e40 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14e50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14e60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14e70 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14e80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14e90 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14eb0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14ed0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14ee0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
14ef0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
14f00 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
14f10 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14f20 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14f30 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
14f40 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
14f50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14f60 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
14f70 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
14f80 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
14f90 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
14fa0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
14fb0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
14fc0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
14fd0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
14fe0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14ff0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
15000 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
15010 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
15020 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
15030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15040 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
15050 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
15060 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
15070 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
15080 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
15090 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
150a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
150b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45  OK ){.    if( ME
150c0 4d 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73  MDB || pagerFlus
150d0 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  hOnCommit(pPager
150e0 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  , bCommit) ){.  
150f0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15100 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
15110 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
15120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
15130 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57  ite3PcacheClearW
15140 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e  ritable(pPager->
15150 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a  pPCache);.    }.
15160 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15170 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
15180 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
15190 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
151a0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
151b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
151c0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
151d0 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
151e0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
151f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
15200 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
15210 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
15220 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
15230 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
15240 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
15250 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
15260 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15270 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
15280 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
15290 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
152a0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
152b0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
152c0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
152d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
152e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
152f0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
15300 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
15310 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
15320 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
15330 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
15340 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
15350 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
15360 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
15370 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
15380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
15390 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
153a0 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
153b0 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
153c0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
153d0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
153e0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
153f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15400 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
15410 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
15420 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
15430 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
15440 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
15450 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
15460 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
15470 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15480 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
15490 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
154a0 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
154b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
154c0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
154d0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
154e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
154f0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
15500 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
15510 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15520 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
15530 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
15540 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63  r->fd) ){.    rc
15550 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15560 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
15570 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
15580 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
15590 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
155a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
155b0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
155c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
155d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
155e0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
155f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15600 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
15610 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
15620 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
15630 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
15640 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
15650 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
15660 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
15670 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15680 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
15690 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
156a0 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
156b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
156c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
156d0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
156e0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
156f0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
15700 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
15710 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
15720 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
15730 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
15740 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15750 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
15760 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15770 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
15780 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
15790 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
157a0 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
157b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
157c0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
157d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
157e0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
157f0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
15800 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
15810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15820 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
15830 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
15840 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
15850 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
15860 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
15870 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
15880 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
15890 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
158a0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
158b0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
158c0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
158d0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
158e0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
158f0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
15900 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
15910 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
15920 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
15930 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
15940 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
15950 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15960 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15970 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
15980 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
15990 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
159a0 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
159b0 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
159c0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
159d0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
159e0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
159f0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
15a00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
15a10 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
15a20 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
15a30 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
15a40 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15a50 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
15a60 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15a70 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
15a80 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
15a90 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
15aa0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15ab0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15ac0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
15ad0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15ae0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
15af0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
15b00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
15b10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
15b20 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
15b30 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
15b40 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
15b50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
15b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15b70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
15b80 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
15b90 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
15ba0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
15bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
15bc0 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
15bd0 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
15be0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
15bf0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
15c00 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
15c10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
15c20 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
15c30 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
15c40 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
15c50 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
15c60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
15c70 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
15c80 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
15c90 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
15ca0 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
15cb0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
15cc0 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
15cd0 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
15ce0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
15cf0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
15d00 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
15d10 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
15d20 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
15d30 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
15d40 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
15d50 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
15d60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15d70 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
15d80 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
15d90 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
15da0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
15db0 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
15dc0 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
15dd0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
15de0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
15df0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
15e00 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
15e10 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
15e20 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
15e30 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
15e40 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
15e50 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
15e60 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
15e70 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
15e80 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
15e90 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
15ea0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
15eb0 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
15ec0 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
15ed0 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
15ee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
15ef0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
15f00 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
15f10 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
15f20 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
15f30 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15f40 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15f50 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15f60 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15f70 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15f80 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15f90 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15fa0 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
15fb0 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
15fc0 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
15fd0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
15fe0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
15ff0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
16000 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
16010 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
16020 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
16030 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16040 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
16050 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
16060 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
16070 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
16080 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
16090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
160a0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
160b0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
160c0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
160d0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
160e0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
160f0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16100 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
16110 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
16120 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16130 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
16140 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
16150 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
16160 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
16170 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
16180 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
161b0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
161c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
161d0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
161e0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
161f0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
16200 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
16210 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  dec */.#endif..#
16220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16230 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _CODEC./*.** Mak
16240 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  e sure the numbe
16250 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69  r of reserved bi
16260 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69  ts is the same i
16270 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
16280 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74  n.** pager as it
16290 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63   is in the sourc
162a0 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75  e.  This comes u
162b0 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20  p when a VACUUM 
162c0 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e  changes the.** n
162d0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
162e0 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f  d bits to the "o
162f0 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a  ptimal" amount..
16300 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16310 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65  agerAlignReserve
16320 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50  (Pager *pDest, P
16330 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69  ager *pSrc){.  i
16340 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72  f( pDest->nReser
16350 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72  ve!=pSrc->nReser
16360 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  ve ){.    pDest-
16370 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63  >nReserve = pSrc
16380 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
16390 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
163a0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pDest);.  }.}.#e
163b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
163c0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
163d0 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
163e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
163f0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
16400 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
16410 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
16420 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
16430 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
16440 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
16450 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
16460 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
16470 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
16480 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
16490 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
164a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
164b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
164c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
164d0 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
164e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
164f0 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
16500 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16510 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
16520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16530 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16540 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
16550 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16570 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16580 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
16590 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
165a0 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
165b0 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
165c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
165d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
165e0 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
165f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
16600 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
16610 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
16620 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
16630 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
16640 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
16650 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
16660 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
16670 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
16680 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
16690 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
166a0 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
166b0 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
166c0 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
166d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
166e0 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
166f0 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
16700 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
16710 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16720 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
16730 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
16740 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16750 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
16760 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
16770 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
16780 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
16790 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
167a0 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
167b0 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
167c0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
167d0 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
167e0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
167f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16800 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
16810 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
16820 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
16830 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
16840 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
16850 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16860 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
16870 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
16880 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16890 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
168a0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
168b0 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
168c0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
168d0 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
168e0 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
168f0 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
16900 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
16910 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
16920 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
16930 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
16940 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
16950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
16960 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
16970 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
16980 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
16990 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
169a0 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
169b0 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
169c0 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
169d0 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
169e0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
169f0 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
16a00 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16a10 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
16a20 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
16a30 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
16a40 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
16a50 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
16a60 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
16a70 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
16a80 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
16a90 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16aa0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
16ab0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
16ac0 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
16ad0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16af0 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
16b00 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
16b10 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b30 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
16b40 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
16b50 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
16b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16b70 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
16b80 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
16b90 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
16ba0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
16bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
16bc0 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
16bd0 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
16be0 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
16bf0 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
16c00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16c10 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
16c20 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
16c30 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
16c40 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
16c50 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
16c60 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
16c70 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
16c80 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
16c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16ca0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16cb0 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
16cc0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
16cd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16ce0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
16cf0 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
16d00 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
16d10 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d30 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
16d40 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
16d50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16d60 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
16d70 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
16d80 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
16d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
16da0 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
16db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16dc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
16dd0 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
16de0 63 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ced */.#ifdef SQ
16df0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16e00 20 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20   /* The jrnlEnc 
16e10 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
16e20 4a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68  Journal pages sh
16e30 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
16e40 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
16e50 63 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66 61  codec.  It is fa
16e60 6c 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d  lse for pure in-
16e70 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e  memory journals.
16e80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
16e90 6a 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69  jrnlEnc = (isMai
16ea0 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d  nJrnl || pPager-
16eb0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30  >subjInMemory==0
16ec0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
16ed0 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16ee0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16ef0 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16f00 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16f10 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
16f20 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
16f30 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
16f40 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16f50 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
16f60 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
16f70 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
16f80 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
16f90 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
16fa0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
16fb0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
16fc0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
16fd0 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
16fe0 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
16ff0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17000 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
17010 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
17020 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
17030 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
17040 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
17050 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
17060 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
17070 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
17080 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
17090 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
170a0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
170b0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
170c0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
170d0 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
170e0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
170f0 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
17100 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
17110 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
17120 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
17130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17140 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
17150 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
17160 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
17170 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
17180 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
17190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
171a0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
171b0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
171c0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
171d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
171e0 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
171f0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
17200 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
17210 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
17220 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
17230 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
17240 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
17250 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
17260 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17270 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
17280 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
17290 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
172a0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
172b0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
172c0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
172d0 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
172e0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
172f0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
17300 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
17310 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17320 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
17330 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
17340 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
17350 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
17360 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
17370 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
17380 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
17390 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
173a0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
173b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
173c0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
173d0 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
173e0 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
173f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
17400 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
17410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17420 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17430 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
17440 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
17450 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
17460 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
17470 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
17480 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
17490 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
174a0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
174b0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
174c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
174d0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
174e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
174f0 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
17500 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
17510 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
17520 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
17530 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
17540 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
17550 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
17560 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
17570 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
17580 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
17590 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
175a0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
175b0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
175c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
175d0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
175e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
175f0 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
17600 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
17610 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
17620 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
17630 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
17640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17650 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
17660 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
17670 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
17680 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
17690 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
176a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
176b0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
176c0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
176d0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
176e0 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
176f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17700 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
17720 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
17730 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
17740 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75  d back before du
17750 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
17760 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
17770 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
17780 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
17790 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
177a0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
177b0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
177c0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
177d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
177e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
177f0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
17800 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
17810 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
17820 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
17830 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
17840 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
17850 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
17860 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
17870 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17880 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
17890 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
178a0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
178b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
178c0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
178d0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
178e0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
178f0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
17900 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
17910 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
17920 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
17930 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
17940 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
17950 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
17960 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
17970 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
17980 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
17990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
179a0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
179b0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
179c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
179d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
179e0 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
179f0 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
17a00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17a10 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
17a20 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
17a30 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17a40 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
17a50 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
17a60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
17a70 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
17a80 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
17a90 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
17aa0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
17ab0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
17ac0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
17ad0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
17ae0 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
17af0 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
17b00 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
17b10 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
17b20 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
17b30 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
17b40 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
17b50 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
17b60 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
17b70 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
17b80 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
17b90 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
17ba0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
17bb0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
17bc0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
17bd0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
17be0 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
17bf0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17c00 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
17c10 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
17c20 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
17c30 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
17c40 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17c50 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
17c60 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
17c70 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
17c80 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
17c90 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
17ca0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
17cb0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
17cc0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
17cd0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
17ce0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17cf0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
17d00 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
17d10 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
17d20 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
17d30 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
17d40 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
17d50 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
17d60 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
17d70 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
17d80 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
17d90 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
17da0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
17db0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
17dc0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
17dd0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
17de0 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
17df0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
17e00 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
17e10 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
17e20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
17e30 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
17e40 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
17e50 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
17e60 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
17e70 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
17e80 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
17e90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17ea0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
17eb0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
17ec0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
17ed0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
17ee0 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
17ef0 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
17f00 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
17f10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17f20 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
17f30 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
17f40 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
17f50 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
17f60 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17f70 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
17f80 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
17f90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
17fa0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
17fb0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17fc0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
17fd0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
17fe0 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
17ff0 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
18000 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
18010 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
18020 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
18030 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
18040 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
18050 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
18060 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
18070 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
18080 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
18090 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
180a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
180b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
180c0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
180d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
180e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
180f0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
18100 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18110 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
18120 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
18130 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
18140 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
18150 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18160 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
18170 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
18180 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  pPg==0 || pPager
18190 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
181a0 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
181b0 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
181c0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
181d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
181e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
181f0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
18200 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
18210 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
18220 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
18230 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
18240 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
18250 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
18260 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
18270 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
18280 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
18290 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
182a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
182b0 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
182c0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
182d0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
182e0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
182f0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
18300 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18310 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
18320 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
18330 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
18340 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
18350 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
18360 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
18370 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
18380 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
18390 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
183a0 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
183b0 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
183c0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
183d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
183e0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
183f0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
18400 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18410 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
18420 74 68 65 20 64 61 74 61 20 72 65 61 64 20 66 72  the data read fr
18430 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  om the journal b
18440 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
18450 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
18460 2a 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  ** This is usual
18470 6c 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72  ly safe even for
18480 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
18490 74 61 62 61 73 65 20 2d 20 61 73 20 74 68 65 20  tabase - as the 
184a0 64 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20  data.    ** was 
184b0 65 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72 65  encrypted before
184c0 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20   it was written 
184d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
184e0 69 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74 69  ile. The excepti
184f0 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20  on.    ** is if 
18500 74 68 65 20 64 61 74 61 20 77 61 73 20 6a 75 73  the data was jus
18510 74 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69  t read from an i
18520 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
18530 72 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20  rnal. In that.  
18540 20 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73    ** case it mus
18550 74 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 68  t be encrypted h
18560 65 72 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  ere before it is
18570 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
18580 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
18590 20 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65   file.  */.#ifde
185a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
185b0 45 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c  EC.    if( !jrnl
185c0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  Enc ){.      COD
185d0 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
185e0 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
185f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18600 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
18610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
18620 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
18630 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
18640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
18650 66 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  fst);.      CODE
18660 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
18670 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
18680 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
18690 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
186a0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
186b0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
186c0 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
186d0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
186e0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20  Size, ofst);..  
186f0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
18700 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
18710 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18720 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
18730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18740 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
18750 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18760 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
18770 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a   if( jrnlEnc ){.
18780 20 20 20 20 20 20 20 20 43 4f 44 45 43 31 28 70          CODEC1(p
18790 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
187a0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
187b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
187c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
187d0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
187e0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
187f0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
18800 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
18810 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18820 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
18830 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29  OMEM_BKPT,aData)
18840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
18850 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
18860 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
18870 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
18880 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
18890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
188a0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
188b0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
188c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
188d0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
188e0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
188f0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
18900 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
18910 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
18920 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18930 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
18940 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
18950 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
18960 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
18970 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
18980 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
18990 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
189a0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
189b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
189c0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
189d0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
189e0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
189f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
18a00 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
18a10 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
18a20 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
18a30 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
18a40 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
18a50 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
18a60 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
18a70 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
18a80 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
18a90 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
18aa0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
18ab0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18ac0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18ad0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
18ae0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
18af0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
18b00 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
18b10 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
18b20 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
18b30 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
18b40 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
18b50 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
18b60 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
18b70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
18b80 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
18b90 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18ba0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
18bb0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
18bc0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
18bd0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
18be0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
18bf0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
18c00 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
18c10 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
18c20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18c30 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
18c40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18c50 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18c60 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
18c70 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
18c80 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18c90 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
18ca0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18cc0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
18cd0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
18ce0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
18cf0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
18d00 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18d10 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
18d20 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18d30 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
18d40 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
18d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73  return rc;.    s
18d70 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18d80 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
18d90 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
18da0 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
18db0 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
18dc0 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
18dd0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
18de0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
18df0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
18e00 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
18e10 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
18e20 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18e30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
18e40 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
18e50 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
18e60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18e70 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
18e80 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
18e90 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
18ea0 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
18eb0 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
18ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
18ed0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
18ee0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
18ef0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
18f00 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
18f10 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
18f20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18f30 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
18f40 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
18f50 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20  pPg);.    /* It 
18f60 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20  used to be that 
18f70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18f80 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20  eClean(pPg) was 
18f90 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75  called here.  Bu
18fa0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61  t.    ** that ca
18fb0 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73  ll was dangerous
18fc0 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65   and had no dete
18fd0 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73  ctable benefit s
18fe0 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20  ince the cache. 
18ff0 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c     ** is normall
19000 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c  y cleaned by sql
19010 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
19020 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62  ll() after rollb
19030 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a  ack and so.    *
19040 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
19050 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ed. */.    pager
19060 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
19070 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
19080 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
19090 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
190a0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
190b0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
190c0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
190d0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
190e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
190f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
19100 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
19110 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
19120 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
19130 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
19140 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
19150 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
19160 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
19170 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20  rom disk */.#if 
19180 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
19190 0a 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63  .    if( jrnlEnc
191a0 20 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65   ){ CODEC1(pPage
191b0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
191c0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
191d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d  E_NOMEM_BKPT); }
191e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
191f0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
19200 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
19210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19220 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
19230 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
19240 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19250 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
19260 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
19270 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
19280 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
19290 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
192a0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
192b0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
192c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
192d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
192e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
192f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19300 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
19310 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
19320 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
19330 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
19340 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
19350 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
19360 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
19370 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
19380 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
19390 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
193a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
193b0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
193c0 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
193d0 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
193e0 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
193f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
19400 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
19410 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
19420 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
19430 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
19440 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
19450 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
19460 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
19470 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
19480 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
19490 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
194a0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
194b0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
194c0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
194d0 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
194e0 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
194f0 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
19500 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
19510 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
19520 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
19530 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
19540 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19550 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
19560 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
19570 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
19580 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
19590 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
195a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
195b0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
195c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
195d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
195e0 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
195f0 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
19600 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
19610 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
19620 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
19630 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
19640 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
19650 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
19660 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
19670 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
19680 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
19690 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
196a0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
196b0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
196c0 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
196d0 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
196e0 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
196f0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
19700 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
19710 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
19720 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
19730 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
19740 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
19750 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
19760 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
19770 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
19780 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
19790 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
197a0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
197b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
197c0 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
197d0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
197e0 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
197f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
19800 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
19810 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
19820 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
19830 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
19840 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
19850 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
19860 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
19870 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
19880 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
19890 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
198a0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
198b0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
198c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
198d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
198e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
198f0 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
19900 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
19910 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
19920 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
19930 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
19940 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
19950 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
19960 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
19970 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
19980 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
19990 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
199a0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
199b0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
199c0 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
199d0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
199e0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
199f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19a00 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19a10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19a30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
19a40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
19a50 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
19a60 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
19a70 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19a80 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
19a90 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
19aa0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
19ab0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
19ac0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
19ad0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
19ae0 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
19af0 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
19b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19b10 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
19b20 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
19b30 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
19b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19b50 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
19b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
19b70 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
19b80 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
19b90 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
19ba0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
19bb0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
19bc0 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
19bd0 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
19be0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
19bf0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19c00 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
19c10 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
19c20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
19c30 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
19c40 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
19c50 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
19c60 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
19c70 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
19c80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19c90 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19cb0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
19cc0 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
19cd0 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
19ce0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
19cf0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
19d00 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
19d10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
19d20 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
19d30 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
19d40 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19d50 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
19d60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19d70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19d80 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19d90 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19da0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19db0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
19dc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19dd0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19de0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
19df0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
19e00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19e10 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19e20 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19e30 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19e40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19e50 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19e60 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19e70 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19e80 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19e90 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
19ea0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
19eb0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
19ec0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
19ed0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
19ee0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
19ef0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
19f00 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
19f10 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19f20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19f30 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19f40 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19f50 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19f60 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19f80 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19f90 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
19fa0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
19fb0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19fc0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19fd0 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
19fe0 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
19ff0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
1a000 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
1a010 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
1a020 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1a030 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
1a040 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
1a050 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
1a060 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
1a070 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
1a080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1a090 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
1a0a0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
1a0b0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
1a0c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a0e0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a0f0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a100 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
1a110 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
1a120 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
1a130 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
1a140 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
1a150 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
1a160 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
1a170 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
1a180 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1a190 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
1a1a0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1a1b0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
1a1c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a1e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a1f0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
1a200 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
1a210 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1a220 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
1a230 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
1a240 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
1a250 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
1a260 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
1a270 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
1a280 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a290 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
1a2a0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1a2b0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
1a2c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a2d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1a2e0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
1a2f0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
1a300 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1a310 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
1a320 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
1a330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a340 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
1a350 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
1a360 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
1a370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a380 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a390 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a3a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a3b0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1a3c0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
1a3d0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
1a3e0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
1a3f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a400 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
1a410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a430 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a440 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a450 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
1a460 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
1a470 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
1a480 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
1a490 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
1a4a0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
1a4b0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
1a4c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a4d0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
1a4e0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a4f0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
1a500 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
1a510 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
1a520 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
1a530 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
1a540 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
1a550 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
1a560 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
1a570 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
1a580 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
1a590 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a5a0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
1a5b0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
1a5c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
1a5d0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
1a5e0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
1a5f0 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
1a600 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a610 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
1a620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1a630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1a640 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
1a650 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
1a660 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a670 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
1a680 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1a690 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
1a6a0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
1a6b0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
1a6c0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
1a6d0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
1a6e0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
1a6f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1a700 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
1a710 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
1a720 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1a730 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
1a740 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
1a750 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
1a760 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
1a770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1a780 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
1a790 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
1a7a0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1a7b0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
1a7c0 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
1a7d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a7e0 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
1a7f0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
1a800 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
1a810 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
1a820 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
1a830 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
1a840 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
1a850 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
1a860 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
1a870 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1a880 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1a890 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
1a8a0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
1a8b0 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
1a8c0 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
1a8d0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
1a8e0 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
1a8f0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
1a900 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
1a910 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
1a920 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
1a930 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
1a940 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
1a950 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
1a960 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
1a970 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
1a980 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
1a990 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
1a9a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1a9b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a9c0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1a9d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
1a9e0 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
1a9f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
1aa00 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
1aa10 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
1aa20 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1aa30 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1aa40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1aa50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
1aa60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1aa70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aa80 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1aa90 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
1aaa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1aab0 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
1aac0 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
1aad0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1aae0 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
1aaf0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1ab00 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1ab10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1ab20 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
1ab30 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
1ab40 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
1ab50 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
1ab60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ab70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ab80 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
1ab90 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
1aba0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
1abb0 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
1abc0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
1abd0 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
1abe0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1abf0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1ac00 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
1ac10 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
1ac20 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
1ac30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ac40 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
1ac50 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
1ac60 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
1ac70 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
1ac80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ac90 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1aca0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
1acb0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
1acc0 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
1acd0 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
1ace0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
1acf0 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
1ad00 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1ad10 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
1ad20 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
1ad30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ad40 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1ad50 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
1ad60 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
1ad70 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1ad80 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
1ad90 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1ada0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1adb0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1adc0 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
1add0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
1ade0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1adf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1ae10 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1ae20 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
1ae30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ae40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ae50 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
1ae60 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1ae70 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
1ae80 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
1ae90 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
1aea0 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
1aeb0 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
1aec0 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
1aed0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
1aee0 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1aef0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1af00 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
1af10 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
1af20 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
1af30 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
1af40 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1af50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1af60 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1af70 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1af80 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1af90 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1afa0 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1afb0 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1afc0 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1afd0 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1afe0 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1aff0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1b000 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1b010 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1b020 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b030 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b040 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1b050 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1b060 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1b070 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1b080 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1b090 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1b0a0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1b0b0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1b0c0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1b0d0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1b0e0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1b0f0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1b100 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1b110 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1b120 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b130 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1b140 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1b150 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1b160 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1b170 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1b180 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1b190 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1b1a0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1b1b0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1b1c0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1b1d0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1b1e0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1b1f0 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1b200 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b210 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1b220 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1b230 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1b240 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1b250 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1b260 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1b270 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1b280 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1b290 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b2a0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1b2b0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1b2c0 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1b2d0 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1b2e0 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1b2f0 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1b300 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1b310 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1b320 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1b330 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1b340 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1b350 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1b360 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1b370 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1b380 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1b390 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1b3a0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1b3b0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1b3c0 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1b3d0 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1b3e0 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1b3f0 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1b400 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1b410 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1b420 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b430 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1b440 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1b450 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1b460 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1b470 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1b480 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1b490 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1b4a0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1b4b0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1b4c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1b4d0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1b4e0 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1b4f0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1b500 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1b510 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1b520 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1b530 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1b540 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1b550 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1b560 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1b570 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1b580 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1b590 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1b5a0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1b5b0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1b5c0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1b5d0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1b5e0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1b5f0 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1b600 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1b610 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1b620 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1b630 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1b640 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1b650 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1b660 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1b670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1b680 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1b690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b6a0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1b6b0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1b6c0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1b6d0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1b6e0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1b6f0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1b700 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1b710 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1b720 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1b730 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1b740 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1b750 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b760 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1b780 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1b790 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1b7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1b7b0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1b7c0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1b7d0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1b7e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1b7f0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1b800 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1b810 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1b820 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b830 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1b840 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1b850 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1b860 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1b870 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1b880 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b890 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b8a0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1b8b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1b8c0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1b8d0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1b8e0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1b8f0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b900 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1b910 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1b920 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1b930 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1b940 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1b950 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1b960 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b970 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1b980 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1b990 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1b9a0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1b9b0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1b9c0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1b9d0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1b9e0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1b9f0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1ba00 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1ba10 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1ba20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ba30 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1ba40 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1ba50 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1ba60 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1ba70 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1ba80 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1ba90 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1baa0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1bab0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1bac0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1bad0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1bae0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1baf0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1bb00 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1bb10 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1bb20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1bb30 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1bb40 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1bb50 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1bb60 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1bb70 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1bb80 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1bb90 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1bba0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1bbb0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1bbc0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1bbd0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1bbe0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1bbf0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1bc00 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1bc10 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1bc20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1bc30 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1bc40 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1bc50 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1bc60 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1bc70 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1bc80 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1bc90 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1bca0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1bcb0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1bcc0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1bcd0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1bce0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1bcf0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1bd00 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1bd10 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1bd20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1bd30 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1bd40 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1bd50 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1bd60 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1bd70 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1bd80 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1bd90 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1bda0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1bdb0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1bdc0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1bdd0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1bde0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1bdf0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1be00 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1be10 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1be20 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1be30 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1be40 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1be50 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1be60 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1be70 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1be80 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1be90 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1bea0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1beb0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1bec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1bed0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1bee0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1bef0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1bf00 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1bf10 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1bf20 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1bf30 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1bf40 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1bf50 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1bf60 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1bf70 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1bf80 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1bf90 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1bfa0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1bfb0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1bfc0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1bfd0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1bfe0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1bff0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1c000 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1c010 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c020 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1c030 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1c040 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1c050 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1c060 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1c070 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1c080 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1c090 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1c0a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1c0b0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1c0c0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1c0d0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1c0e0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1c0f0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1c100 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1c110 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1c120 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1c130 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1c140 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1c150 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1c160 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1c170 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1c180 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1c190 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1c1a0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1c1b0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1c1c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c1d0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1c1e0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1c210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1c220 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1c230 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1c240 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c250 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1c260 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1c270 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1c280 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1c290 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1c2a0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1c2b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1c2c0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1c2d0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1c2e0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1c310 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1c320 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c340 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1c350 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1c360 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1c370 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1c380 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1c390 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1c3a0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1c3b0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1c3c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1c3d0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1c3e0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1c3f0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1c400 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1c410 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1c420 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c430 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1c440 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 73  urnal */.  u32 s
1c450 61 76 65 64 50 61 67 65 53 69 7a 65 20 3d 20 70  avedPageSize = p
1c460 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c470 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1c480 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1c490 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1c4a0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1c4b0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1c4c0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1c4d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c4e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c4f0 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1c500 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1c510 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1c520 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1c530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c540 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c550 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1c560 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1c570 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1c580 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1c590 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1c5a0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1c5b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1c5c0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1c5d0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1c5e0 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1c5f0 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1c600 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1c610 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1c620 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1c630 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1c640 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1c650 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1c660 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1c670 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1c680 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1c690 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1c6a0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1c6b0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1c6c0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1c6d0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1c6e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1c6f0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1c700 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1c710 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1c720 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  ** mxPathname is
1c730 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
1c740 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
1c750 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
1c760 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
1c770 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
1c780 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1c790 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1c7a0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c7c0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c7d0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c7e0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
1c7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c800 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
1c810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c820 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
1c830 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
1c840 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
1c850 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
1c860 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1c870 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
1c880 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
1c890 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1c8a0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1c8b0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
1c8c0 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
1c8d0 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
1c8e0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
1c8f0 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
1c900 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
1c910 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
1c920 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c930 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
1c940 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
1c950 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
1c960 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
1c970 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1c980 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
1c990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1c9a0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c9b0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c9c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
1c9d0 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
1c9e0 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
1c9f0 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
1ca00 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
1ca10 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
1ca20 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
1ca30 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65  rocess must have
1ca40 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
1ca50 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
1ca60 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
1ca70 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
1ca80 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1ca90 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
1caa0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
1cab0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
1cac0 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
1cad0 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
1cae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1caf0 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
1cb00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1cb10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cb20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1cb30 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1cb40 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
1cb50 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1cb60 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1cb70 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
1cb80 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1cb90 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
1cba0 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
1cbb0 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
1cbc0 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
1cbd0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1cbe0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
1cbf0 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
1cc00 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1cc10 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
1cc20 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
1cc30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1cc40 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
1cc50 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
1cc60 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1cc70 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
1cc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cc90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cca0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1ccb0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1ccc0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1ccd0 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
1cce0 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
1ccf0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1cd00 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
1cd10 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1cd20 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
1cd30 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
1cd40 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
1cd50 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
1cd60 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
1cd70 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
1cd80 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
1cd90 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
1cda0 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
1cdb0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
1cdc0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1cdd0 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
1cde0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
1cdf0 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
1ce00 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
1ce10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1ce20 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
1ce30 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
1ce40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1ce50 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1ce60 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
1ce70 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
1ce80 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
1ce90 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
1cea0 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
1ceb0 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
1cec0 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
1ced0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1cee0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
1cef0 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
1cf00 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
1cf10 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
1cf20 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
1cf30 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
1cf40 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
1cf50 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
1cf60 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
1cf70 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
1cf80 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
1cf90 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
1cfa0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1cfb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
1cfc0 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
1cfd0 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
1cfe0 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
1cff0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1d000 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
1d010 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
1d020 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
1d030 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
1d040 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1d050 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
1d060 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1d070 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1d080 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1d090 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1d0a0 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
1d0b0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1d0c0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
1d0d0 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
1d0e0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1d0f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1d100 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1d110 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
1d120 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
1d130 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
1d140 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d150 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
1d160 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
1d170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d180 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d190 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1d1a0 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
1d1b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
1d1c0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1d1d0 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
1d1e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d1f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
1d200 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1d210 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1d220 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
1d230 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d240 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
1d250 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
1d260 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
1d270 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
1d280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1d290 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
1d2a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1d2b0 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
1d2c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
1d2d0 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
1d2e0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1d2f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1d300 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
1d310 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
1d320 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1d330 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1d340 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67  age(pPager,&pPag
1d350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30  er->journalOff,0
1d360 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ,1,0);.      if(
1d370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d380 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62  {.        nPlayb
1d390 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ack++;.      }el
1d3a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1d3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1d3c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1d3d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d3e0 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1d3f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d400 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1d410 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d420 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1d430 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1d440 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1d450 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1d460 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1d470 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d480 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1d490 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1d4a0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1d4b0 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1d4c0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1d4d0 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1d4e0 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1d4f0 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1d500 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1d510 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1d520 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1d530 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1d540 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1d550 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1d560 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1d570 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1d580 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1d590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1d5a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d5b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d5c0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1d5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d5e0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d5f0 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1d600 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1d610 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1d620 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1d630 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1d640 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1d650 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1d660 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1d670 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1d680 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1d690 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1d6a0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1d6b0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1d6c0 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1d6d0 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1d6e0 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1d6f0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1d700 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d710 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1d720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1d740 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1d750 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1d760 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
1d770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d790 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1d7a0 28 70 50 61 67 65 72 2c 20 26 73 61 76 65 64 50  (pPager, &savedP
1d7b0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
1d7c0 7d 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  }.  /* Following
1d7d0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1d7e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1d7f0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1d800 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1d810 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1d820 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1d830 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1d840 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1d850 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1d860 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1d870 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1d880 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1d890 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1d8a0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d8b0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1d8c0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1d8d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d8e0 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1d8f0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1d900 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1d910 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1d920 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1d930 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d940 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1d950 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1d960 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1d970 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1d980 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1d990 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1d9a0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1d9b0 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1d9c0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1d9d0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1d9e0 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1d9f0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1da00 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1da10 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1da20 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1da30 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1da40 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1da50 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1da60 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1da70 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1da80 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1da90 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1daa0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1dab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1dac0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1dad0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dae0 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1daf0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1db00 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1db10 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1db20 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1db30 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1db40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1db50 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1db60 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1db70 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1db80 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1db90 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1dba0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1dbb0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1dbc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1dbd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dbe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1dbf0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1dc00 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1dc10 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1dc20 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1dc30 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1dc40 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1dc50 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1dc60 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1dc70 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1dc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1dc90 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1dca0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1dcb0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1dcc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1dcd0 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1dce0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dcf0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1dd00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dd10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dd20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1dd30 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1dd40 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1dd50 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1dd60 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1dd70 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1dd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dd90 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1dda0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1ddb0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1ddc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1ddd0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1dde0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1ddf0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1de00 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1de10 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1de20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1de30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1de40 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1de50 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1de60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1de70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1de80 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1de90 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1dea0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1deb0 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1dec0 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1ded0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1dee0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1df00 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1df10 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1df20 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1df30 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1df40 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1df50 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1df60 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1df70 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1df80 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1df90 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1dfa0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1dfb0 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1dfc0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1dfd0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1dfe0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1dff0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1e000 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e010 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1e020 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1e030 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1e040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e050 20 66 69 6c 65 20 28 6f 72 20 6f 75 74 20 6f 66   file (or out of
1e060 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69 66 20 74  .** the WAL if t
1e070 68 61 74 20 69 73 20 77 68 65 72 65 20 74 68 65  hat is where the
1e080 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 70   most recent cop
1e090 79 20 69 66 20 66 6f 75 6e 64 29 20 69 6e 74 6f  y if found) into
1e0a0 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1e0b0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1e0c0 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1e0d0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1e0e0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1e0f0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1e100 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1e110 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1e120 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1e130 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1e140 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1e150 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1e160 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1e170 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e180 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1e190 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1e1a0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1e1b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1e1c0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1e1d0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e1e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1e1f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1e200 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1e210 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1e220 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1e230 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1e240 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1e250 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1e260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e270 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1e280 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e290 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1e2a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32  E_OMIT_WAL.  u32
1e2b0 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
1e2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
1e2d0 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e 74 61 69  me of WAL contai
1e2e0 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20  ning pgno */..  
1e2f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e300 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1e310 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1e320 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1e330 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1e340 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
1e350 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1e360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e370 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
1e380 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e  ger->pWal, pPg->
1e390 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
1e3a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e3b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1e3c0 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1e3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1e3e0 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1e3f0 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 70 50  >pWal, iFrame,pP
1e400 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 70  ager->pageSize,p
1e410 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1e420 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1e430 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1e440 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28   (pPg->pgno-1)*(
1e450 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1e460 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
1e470 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1e480 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
1e490 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1e4a0 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b  eSize, iOffset);
1e4b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e4c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1e4d0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1e4e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e4f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1e500 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  Pg->pgno==1 ){. 
1e510 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e520 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1e530 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1e540 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1e550 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1e560 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1e570 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1e580 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1e590 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1e5a0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1e5b0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1e5c0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1e5d0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1e5e0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1e5f0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1e600 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1e610 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e620 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1e630 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1e640 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1e650 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1e660 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1e670 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1e680 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1e690 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1e6a0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1e6b0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1e6c0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1e6d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1e6e0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1e6f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1e700 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1e710 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1e720 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1e730 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e740 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1e750 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1e760 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1e770 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71  * white noise eq
1e780 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1e790 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1e7a0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1e7b0 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1e7c0 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1e7d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1e7e0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1e7f0 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1e800 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1e810 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1e820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1e830 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1e840 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1e850 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1e860 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1e870 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1e880 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1e890 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1e8a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1e8b0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1e8c0 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
1e8d0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1e8e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1e8f0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1e900 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1e910 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1e920 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1e930 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1e940 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1e950 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1e960 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1e970 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1e980 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1e990 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1e9a0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1e9b0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1e9c0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1e9d0 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1e9e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e9f0 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1ea00 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1ea10 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1ea20 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1ea30 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1ea40 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1ea50 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1ea60 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1ea70 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1ea80 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1ea90 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1eaa0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1eab0 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1eac0 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1ead0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1eae0 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1eaf0 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1eb00 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1eb10 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1eb20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1eb30 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1eb40 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1eb50 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1eb60 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1eb70 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1eb80 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1eb90 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1eba0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1ebb0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1ebc0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1ebd0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1ebe0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1ebf0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1ec00 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1ec10 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1ec20 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1ec30 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1ec40 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1ec50 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1ec60 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1ec70 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1ec80 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1ec90 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1eca0 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1ecb0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1ecc0 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1ecd0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1ece0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1ecf0 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1ed00 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1ed10 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1ed20 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1ed30 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1ed40 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1ed50 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1ed60 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1ed70 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1ed80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ed90 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1eda0 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1edb0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1edc0 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1edd0 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1ede0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1edf0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1ee00 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1ee10 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1ee20 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1ee30 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1ee40 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1ee50 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1ee60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ee70 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1ee80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1ee90 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1eea0 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1eeb0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1eec0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1eed0 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1eee0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1eef0 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1ef00 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1ef10 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1ef20 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1ef30 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1ef40 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1ef50 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1ef60 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1ef70 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1ef80 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1ef90 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1efa0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1efb0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1efc0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1efd0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1efe0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1eff0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1f000 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1f010 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f020 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1f030 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1f040 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1f050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ;..  assert( pag
1f060 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f070 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69   );.  pPg = sqli
1f080 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1f090 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1f0a0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1f0b0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1f0c0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1f0d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1f0e0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1f0f0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1f100 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1f110 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
1f120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1f140 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1f150 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1f160 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f170 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
1f180 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
1f190 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
1f1a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1f1b0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
1f1c0 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
1f1d0 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
1f1e0 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
1f1f0 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
1f200 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1f210 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
1f220 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
1f230 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
1f240 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
1f250 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
1f260 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
1f270 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
1f280 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
1f290 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
1f2a0 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
1f2b0 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
1f2c0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
1f2d0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f2e0 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
1f2f0 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
1f300 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
1f310 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
1f320 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
1f330 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
1f340 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
1f350 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
1f360 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
1f370 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
1f380 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1f390 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1f3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f3b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f3c0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
1f3d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
1f3e0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
1f3f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f400 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
1f410 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f420 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1f450 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1f460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f470 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
1f480 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
1f490 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
1f4a0 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
1f4b0 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
1f4c0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
1f4d0 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
1f4e0 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
1f4f0 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
1f500 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
1f510 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
1f520 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
1f530 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
1f540 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
1f550 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
1f560 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
1f570 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
1f580 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
1f590 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f5a0 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
1f5b0 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
1f5c0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1f5d0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
1f5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1f5f0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
1f600 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
1f610 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
1f620 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ager);.  pList =
1f630 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1f640 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1f650 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c  pPCache);.  whil
1f660 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d  e( pList && rc==
1f670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f680 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
1f690 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
1f6a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64     rc = pagerUnd
1f6b0 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20  oCallback((void 
1f6c0 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  *)pPager, pList-
1f6d0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73  >pgno);.    pLis
1f6e0 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  t = pNext;.  }..
1f6f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f700 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f710 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
1f720 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57   around sqlite3W
1f730 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77  alFrames(). As w
1f740 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a  ell as logging.*
1f750 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
1f760 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  f the list of pa
1f770 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c  ges headed by pL
1f780 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ist (connected b
1f790 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68  y pDirty),.** th
1f7a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69  is function noti
1f7b0 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20  fies any active 
1f7c0 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1f7d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20   that the pages 
1f7e0 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e  have.** changed.
1f7f0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74   .**.** The list
1f800 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64   of pages passed
1f810 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
1f820 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72  ne is always sor
1f830 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62  ted by page numb
1f840 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66  er..** Hence, if
1f850 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20   page 1 appears 
1f860 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1f870 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65  list, it will be
1f880 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e   the first page.
1f890 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
1f8a0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
1f8b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1f8e0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
1f8f0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1f900 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1f910 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
1f920 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
1f930 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1f940 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f950 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
1f960 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
1f970 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f990 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1f9a0 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20  a commit */.){. 
1f9b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f9e0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20  */.  int nList; 
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fa10 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74  f pages in pList
1fa20 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20   */.  PgHdr *p; 
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1fa50 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20  ping over pages 
1fa60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1fa70 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
1fa80 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1fa90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1faa0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
1fab0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c   that the page l
1fac0 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64  ist is in accend
1fad0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66  ing order */.  f
1fae0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26  or(p=pList; p &&
1faf0 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d   p->pDirty; p=p-
1fb00 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1fb10 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20  sert( p->pgno < 
1fb20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20  p->pDirty->pgno 
1fb30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1fb40 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1fb50 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43  pDirty==0 || isC
1fb60 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69  ommit );.  if( i
1fb70 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1fb80 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1fb90 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1fba0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1fbb0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1fbc0 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1fbd0 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1fbe0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1fbf0 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1fc00 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1fc10 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1fc20 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1fc30 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1fc40 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1fc50 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1fc60 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1fc70 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1fc80 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1fc90 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  st;.    nList = 
1fca0 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  0;.    for(p=pLi
1fcb0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1fcc0 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74  )!=0; p=p->pDirt
1fcd0 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1fce0 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1fcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65   ){.        ppNe
1fd00 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1fd10 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b  .        nList++
1fd20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fd30 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1fd40 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1fd50 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
1fd60 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
1fd70 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
1fd80 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
1fd90 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1fda0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
1fdb0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1fdc0 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
1fdd0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1fde0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1fdf0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1fe00 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1fe10 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1fe20 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
1fe30 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1fe40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fe50 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1fe60 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  up ){.    for(p=
1fe70 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1fe80 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1fe90 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1fea0 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1feb0 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1fec0 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1fed0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
1fee0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1fef0 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
1ff00 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1ff10 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1ff20 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
1ff30 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1ff40 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
1ff50 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
1ff60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1ff70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ff80 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
1ff90 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1ffa0 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
1ffb0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
1ffc0 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
1ffd0 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
1ffe0 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
1fff0 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
20000 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
20010 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
20020 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
20030 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
20040 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
20050 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
20060 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
20070 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
20080 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
20090 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
200a0 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
200b0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
200c0 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
200d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
200e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
200f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20120 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
20130 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20140 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
20150 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
20160 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
20170 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20180 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20190 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
201a0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
201b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
201c0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
201d0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
201e0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
201f0 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
20200 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
20210 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
20220 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
20230 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
20240 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
20250 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
20260 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
20270 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
20280 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
20290 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
202a0 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
202b0 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
202c0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
202d0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
202e0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
202f0 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
20300 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
20310 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20320 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
20330 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
20340 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
20350 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
20360 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
20370 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
20380 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
20390 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
203a0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
203b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
203c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
203d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
203e0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
203f0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
20400 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
20410 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
20420 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
20430 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
20440 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20450 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
20460 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
20470 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
20480 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
20490 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
204a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
204b0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
204c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
204d0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
204e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
204f0 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
20500 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
20510 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
20520 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
20530 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
20540 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
20550 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
20560 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
20570 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
20580 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
20590 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
205a0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
205b0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
205e0 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
205f0 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
20600 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
20610 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
20620 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
20630 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
20640 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20650 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
20660 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
20670 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
20680 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
20690 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
206a0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
206b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
206c0 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
206d0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
206e0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
206f0 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
20700 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
20710 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
20720 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
20730 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
20740 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20750 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20760 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
20770 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
20780 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
20790 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
207a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
207b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
207c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
207d0 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
207e0 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
207f0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
20800 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
20810 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
20820 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20830 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
20840 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d  he.  ** WAL sub-
20850 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e  system, determin
20860 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  e the page count
20870 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
20880 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ze of.  ** the d
20890 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
208a0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
208b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
208c0 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69  is not an.  ** i
208d0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
208e0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
208f0 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72  , round up the r
20900 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
20910 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c  ( nPage==0 && AL
20920 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67  WAYS(isOpen(pPag
20930 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
20940 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20960 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
20970 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
20980 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20990 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
209a0 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
209b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
209c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
209d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
209e0 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
209f0 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
20a00 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
20a10 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
20a20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
20a30 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
20a40 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
20a50 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
20a60 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
20a70 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
20a80 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
20a90 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
20aa0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
20ab0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
20ac0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
20ad0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
20ae0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
20af0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
20b00 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
20b10 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
20b20 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
20b30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
20b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b50 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
20b60 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
20b70 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
20b80 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
20b90 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
20ba0 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
20bb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20bc0 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
20bd0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
20be0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
20bf0 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
20c00 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
20c10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20c20 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
20c30 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
20c40 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
20c50 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
20c60 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
20c70 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
20c80 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
20c90 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
20ca0 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
20cb0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
20cc0 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
20cd0 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
20ce0 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
20cf0 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
20d00 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
20d10 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
20d20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20d30 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
20d40 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
20d50 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
20d60 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
20d70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20d80 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
20d90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
20da0 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
20db0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
20dc0 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
20dd0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
20de0 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
20df0 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
20e00 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
20e10 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
20e20 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
20e30 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
20e40 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
20e50 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
20e60 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
20e70 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
20e80 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
20e90 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
20ea0 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
20eb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20ec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20ee0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20ef0 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
20f00 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
20f10 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
20f20 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
20f30 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
20f40 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f60 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
20f70 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
20f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
20f90 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 70  ccess(.        p
20fa0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20fb0 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
20fc0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
20fd0 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20   &isWal.    );. 
20fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21000 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
21010 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
21040 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21050 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ..        rc = p
21060 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
21070 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
21080 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
21090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
210a0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
210c0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
210d0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
210e0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
210f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21100 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21110 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
21120 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
21130 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
21140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
21150 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21160 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
21170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21180 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
21190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
211a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
211b0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
211c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
211d0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
211e0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
211f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21210 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21220 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
21230 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
21240 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
21250 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
21260 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
21270 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
21280 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
21290 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
212a0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
212b0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
212c0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
212d0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
212e0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
212f0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
21300 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
21310 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
21320 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
21330 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
21340 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
21350 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
21360 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
21370 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
21380 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
21390 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
213a0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
213b0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
213c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
213d0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
213e0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
213f0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21400 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
21410 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
21420 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21430 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21440 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
21450 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
21460 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
21470 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21480 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
21490 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
214a0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
214b0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
214c0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
214d0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
214e0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
214f0 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
21500 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
21510 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
21520 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
21530 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
21540 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
21550 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21560 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
21570 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21580 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
21590 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
215a0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
215b0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
215c0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
215d0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
215e0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
215f0 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
21600 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
21610 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
21620 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
21630 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
21640 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
21650 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
21660 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
21670 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
21680 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
21690 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
216a0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
216b0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
216c0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
216d0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
216e0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
216f0 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
21700 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
21710 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
21720 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
21730 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
21740 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
21750 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
21760 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
21770 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
21780 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
21790 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
217a0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
217b0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
217c0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
217d0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
217e0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
217f0 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
21800 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
21810 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
21820 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
21830 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
21840 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
21850 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
21860 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
21870 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
21880 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
21890 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
218a0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
218b0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
218c0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
218d0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
218e0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
218f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
21900 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
21910 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21920 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
21930 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
21940 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
21950 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
21960 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21970 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
21980 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
21990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
219a0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
219b0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
219c0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
219d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
219e0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
219f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
21a00 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
21a10 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
21a20 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
21a30 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
21a40 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
21a50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
21a60 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
21a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21a80 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
21a90 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
21aa0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
21ab0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
21ac0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
21ad0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
21ae0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
21af0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21b00 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
21b10 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
21b20 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
21b30 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
21b40 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
21b50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21b60 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
21b70 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
21b80 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
21b90 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
21ba0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
21bb0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
21bc0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
21bd0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
21be0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21bf0 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
21c00 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
21c10 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
21c20 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
21c30 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
21c40 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
21c50 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
21c60 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
21c70 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21c80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
21c90 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
21ca0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
21cb0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
21cc0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
21cd0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
21ce0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
21cf0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
21d00 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
21d10 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
21d20 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
21d30 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
21d40 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
21d50 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
21d60 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
21d70 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
21d80 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
21d90 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
21da0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
21db0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
21dc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
21dd0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
21de0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
21df0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
21e00 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
21e10 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
21e20 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
21e30 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21e40 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
21e50 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
21e60 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
21e70 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
21e80 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
21e90 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
21ea0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
21eb0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
21ec0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
21ed0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
21ee0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
21ef0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
21f00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
21f10 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
21f20 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
21f30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
21f40 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
21f50 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
21f60 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
21f70 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
21f80 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
21f90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21fa0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
21fb0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21fc0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
21fd0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21fe0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
21ff0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22000 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
22010 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
22020 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22030 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
22040 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
22050 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
22060 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22070 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22090 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
220a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
220b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
220c0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
220d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
220e0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
220f0 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
22100 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
22110 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
22120 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
22130 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
22140 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
22150 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
22160 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
22170 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
22180 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
22190 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
221a0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
221b0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
221c0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
221d0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
221e0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
221f0 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
22200 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
22210 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
22220 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
22230 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
22240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22250 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22260 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
22270 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22280 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
22290 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
222a0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
222b0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
222c0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
222d0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
222e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
222f0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
22300 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
22310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22320 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
22330 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
22340 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
22350 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
22360 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
22370 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
22380 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
22390 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
223a0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
223b0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
223c0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
223d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
223e0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
223f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22400 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
22410 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
22420 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
22430 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
22440 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
22450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22460 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
22470 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
22480 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
22490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
224a0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
224b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
224c0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
224d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
224e0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
224f0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
22500 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
22510 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
22520 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22530 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22540 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
22550 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
22560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22570 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
22580 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
22590 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
225a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
225b0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
225c0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
225d0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
225e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
225f0 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
22600 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
22610 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
22620 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
22630 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
22640 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
22650 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
22660 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
22670 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22680 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
22690 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
226a0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
226b0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
226c0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
226d0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
226e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
226f0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
22700 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
22710 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
22720 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
22730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22740 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
22750 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
22760 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
22770 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
22780 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
22790 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
227a0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
227b0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
227c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
227d0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
227e0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
227f0 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
22800 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22810 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22820 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
22830 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
22840 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
22850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22860 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22870 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
22880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22890 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
228a0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
228b0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
228c0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
228d0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
228e0 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
228f0 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
22900 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
22910 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22920 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
22930 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
22940 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
22950 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
22960 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
22970 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
22980 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22990 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
229a0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
229b0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
229c0 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
229d0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
229e0 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
229f0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
22a00 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
22a10 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
22a20 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
22a30 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22a40 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
22a50 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
22a60 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
22a70 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
22a80 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22a90 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
22aa0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22ab0 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
22ac0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
22ad0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
22ae0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
22af0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22b00 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
22b10 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
22b20 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
22b30 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
22b40 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
22b50 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
22b60 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
22b70 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
22b80 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
22b90 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
22ba0 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65  sz>0);.    setGe
22bb0 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
22bc0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  r);.    sqlite3O
22bd0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
22be0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
22bf0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
22c00 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
22c10 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
22c20 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22c30 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
22c40 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
22c50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22c60 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
22c70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
22c80 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
22c90 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
22ca0 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
22cb0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
22cc0 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
22cd0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
22ce0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
22cf0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
22d00 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
22d10 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
22d20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22d30 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
22d40 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
22d50 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
22d60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
22d80 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
22d90 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
22da0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22db0 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
22dc0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
22dd0 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
22de0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22df0 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
22e00 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
22e10 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
22e20 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
22e30 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
22e40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
22e50 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
22e60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
22e70 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
22e80 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
22e90 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
22ea0 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
22eb0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
22ec0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
22ed0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22ee0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22ef0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22f00 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22f10 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
22f20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
22f30 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
22f40 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22f50 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
22f60 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22f70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22f80 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22f90 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22fa0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22fb0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22fc0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22fd0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22fe0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22ff0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
23000 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
23010 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
23020 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
23030 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
23040 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
23050 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
23060 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
23070 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
23080 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
23090 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
230a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
230b0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
230c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
230d0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
230e0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
230f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
23100 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
23110 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
23120 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
23130 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
23140 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
23150 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
23160 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
23170 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
23180 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
231a0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
231b0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
231c0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
231d0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
231e0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
231f0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
23200 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
23210 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
23220 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
23230 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
23240 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
23250 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23260 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
23270 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
23280 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
23290 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
232a0 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
232b0 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
232c0 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
232d0 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
232e0 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
232f0 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
23300 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
23310 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
23320 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
23330 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
23340 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
23350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
23360 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
23370 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
23380 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
23390 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
233a0 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
233b0 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
233c0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
233d0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
233e0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
233f0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
23400 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
23410 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
23420 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
23430 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
23440 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
23450 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
23460 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23470 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
23480 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
23490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
234a0 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
234b0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
234c0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
234d0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
234e0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
234f0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
23500 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
23510 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
23520 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
23530 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
23540 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
23550 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
23560 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
23570 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
23580 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23590 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
235a0 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
235b0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
235c0 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
235d0 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
235e0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
235f0 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
23600 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
23610 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
23620 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
23630 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
23640 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
23650 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
23660 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
23670 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
23680 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
23690 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
236a0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
236b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
236c0 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
236d0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
236e0 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
236f0 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
23700 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
23710 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
23720 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
23730 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
23740 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
23750 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
23760 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
23770 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
23780 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
23790 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
237a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
237b0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
237c0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
237d0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
237e0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
237f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
23800 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
23810 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
23820 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
23830 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23840 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
23850 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
23860 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
23870 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
23880 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
23890 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
238a0 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
238b0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
238c0 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
238d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
238e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
238f0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
23900 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23910 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
23920 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
23930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23940 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
23950 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23960 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
23970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23980 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
23990 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
239a0 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
239b0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
239c0 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
239d0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
239e0 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
239f0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
23a00 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23a10 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
23a20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
23a30 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
23a40 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
23a50 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23a60 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23a70 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
23a80 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23a90 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23aa0 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
23ab0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
23ac0 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79  gs = (pPager->sy
23ad0 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69  ncFlags<<2);.  i
23ae0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
23af0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23b00 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23b10 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  |= pPager->syncF
23b20 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
23b30 28 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52  (pgFlags & PAGER
23b40 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29  _CKPT_FULLFSYNC)
23b50 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
23b60 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23b70 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23b80 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f  |= (SQLITE_SYNC_
23b90 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20  FULL<<2);.  }.  
23ba0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23bb0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
23bc0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
23bd0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
23be0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
23bf0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23c00 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23c10 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23c20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23c30 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23c40 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23c50 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
23c60 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
23c70 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
23c80 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
23c90 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
23ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
23cb0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
23cc0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23cd0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
23ce0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
23cf0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
23d00 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23d10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
23d20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23d30 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
23d40 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
23d50 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
23d60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23d70 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
23d80 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
23d90 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
23da0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
23db0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
23dc0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
23dd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
23de0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
23df0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
23e00 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23e10 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
23e20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
23e30 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
23e40 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
23e50 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
23e60 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
23e70 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23e80 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
23e90 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
23ea0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
23eb0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
23ec0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23ed0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23ee0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
23ef0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
23f00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23f20 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23f30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
23f40 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
23f50 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23f60 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
23f70 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
23f80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
23f90 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
23fa0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
23fb0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23fc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23fd0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
23fe0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
23ff0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
24000 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
24010 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
24020 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
24030 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
24040 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
24050 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
24060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
24070 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
24080 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
24090 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
240a0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
240b0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
240c0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
240d0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
240e0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
240f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
24100 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
24110 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
24120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24130 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
24140 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
24150 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
24160 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
24170 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
24180 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
24190 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
241a0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
241b0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
241c0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
241d0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
241e0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
241f0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
24200 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
24210 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
24220 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
24230 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
24240 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
24250 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
24260 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
24270 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
24280 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
24290 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
242a0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
242b0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
242c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
242d0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
242e0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
24310 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
24320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24350 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
24360 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
24370 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
24380 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
24390 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
243a0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
243b0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
243c0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
243d0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
243e0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
243f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
24400 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
24410 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
24420 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
24430 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
24440 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
24450 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
24460 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
24470 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
24480 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
24490 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
244a0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
244b0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
244c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
244d0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
244e0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
244f0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
24500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24510 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
24520 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
24530 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
24540 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24550 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
24560 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
24570 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
24580 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
24590 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
245a0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
245b0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
245c0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
245d0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
245e0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
245f0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
24600 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
24610 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
24620 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
24630 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
24640 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
24650 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24660 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
24670 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
24680 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
24690 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
246a0 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
246b0 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
246c0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
246d0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
246e0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
246f0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
24700 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
24710 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
24720 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
24730 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
24740 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
24750 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
24760 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
24770 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24780 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
24790 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
247a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
247b0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
247c0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
247d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
247e0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
247f0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
24800 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
24810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
24820 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
24830 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
24840 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
24850 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
24860 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
24870 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
24880 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
24890 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
248a0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
248b0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
248c0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
248d0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
248e0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
248f0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
24900 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
24910 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
24920 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
24930 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
24940 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
24950 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
24960 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
24970 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
24980 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
24990 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
249a0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
249b0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
249c0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
249d0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
249e0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
249f0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
24a00 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
24a10 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
24a20 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
24a30 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
24a40 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
24a50 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
24a60 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
24a70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
24a80 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
24a90 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
24aa0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
24ab0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
24ac0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
24ad0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
24ae0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
24af0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
24b00 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24b10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24b20 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
24b30 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
24b40 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
24b50 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
24b60 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
24b70 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
24b80 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
24b90 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
24ba0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
24bb0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
24bc0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
24bd0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
24be0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
24bf0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
24c00 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
24c10 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
24c20 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
24c30 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24c40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24c50 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
24c60 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
24c70 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
24c80 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
24c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ca0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
24cb0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
24cc0 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
24cd0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
24ce0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
24cf0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
24d00 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
24d10 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
24d20 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
24d30 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
24d40 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
24d50 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
24d60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
24d70 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
24d80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
24d90 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
24da0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
24db0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
24dc0 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
24dd0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
24de0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
24df0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
24e00 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
24e10 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24e20 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
24e30 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
24e40 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
24e50 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
24e60 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
24e70 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
24e80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
24e90 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
24ea0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
24eb0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
24ec0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
24ed0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
24ee0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
24ef0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
24f00 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
24f10 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24f20 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
24f30 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
24f40 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
24f50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
24f60 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
24f70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
24f80 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
24f90 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
24fa0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
24fb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
24fc0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
24fd0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
24fe0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25000 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
25010 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
25020 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
25030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25040 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
25050 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
25060 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
25070 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
25080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25090 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  EM_BKPT;.    }..
250a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
250b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
250c0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
250d0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
250e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
250f0 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
25100 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
25110 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25140 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
25150 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
25160 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
25170 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
25180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
25190 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
251a0 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
251b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
251c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
251d0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
251e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
251f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
25200 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
25210 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
25220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
25230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25240 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
25250 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
25260 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
25270 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
25280 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
25290 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
252a0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
252b0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
252c0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
252d0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
252e0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
252f0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
25300 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
25310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25320 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25330 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
25340 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
25350 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
25360 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
25370 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
25380 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
25390 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
253a0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
253b0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
253c0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
253d0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
253e0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
253f0 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
25400 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
25410 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
25420 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
25430 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
25440 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
25450 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
25460 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
25470 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
25480 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
25490 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
254a0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
254b0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
254c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
254d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
254e0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
254f0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
25500 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
25510 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
25520 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
25530 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
25540 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
25550 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
25560 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
25570 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
25580 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
25590 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
255a0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
255b0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
255c0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
255d0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
255e0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
255f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
25600 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
25610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
25620 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
25630 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
25640 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
25650 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
25660 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25670 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
25680 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
25690 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
256a0 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
256b0 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
256c0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
256d0 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
256e0 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
256f0 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
25700 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
25710 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
25720 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
25730 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25740 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
25750 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
25760 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
25770 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
25780 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
25790 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
257a0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
257b0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
257c0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
257d0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
257e0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
257f0 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
25800 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
25810 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
25820 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
25830 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
25840 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
25850 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25860 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
25870 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25880 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
25890 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
258a0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
258b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
258c0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
258d0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
258e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
258f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25900 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
25910 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
25920 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25930 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
25940 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25950 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
25960 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
25970 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
25980 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25990 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
259a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
259b0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
259c0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
259d0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
259e0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
259f0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
25a00 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
25a10 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
25a20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
25a30 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
25a40 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
25a50 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
25a60 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
25a70 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
25a80 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
25a90 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
25aa0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
25ab0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
25ac0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
25ad0 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
25ae0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
25af0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
25b00 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
25b10 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
25b20 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
25b30 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
25b40 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
25b50 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
25b60 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
25b70 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
25b80 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
25b90 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
25ba0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25bb0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
25bc0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
25bd0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25be0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25bf0 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
25c00 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
25c10 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
25c20 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
25c30 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
25c40 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
25c50 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
25c60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
25c70 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
25c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
25c90 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
25ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
25cb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
25cc0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
25cd0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
25ce0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
25cf0 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
25d00 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
25d10 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
25d20 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
25d30 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
25d40 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
25d50 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
25d60 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
25d70 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
25d80 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
25d90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
25da0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
25db0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
25dc0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
25dd0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
25de0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
25df0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
25e00 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
25e10 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
25e20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
25e30 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25e40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25e70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25e80 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
25e90 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
25ea0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
25eb0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
25ec0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
25ed0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
25ee0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
25ef0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
25f00 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
25f10 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
25f20 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
25f30 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
25f40 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
25f50 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
25f60 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
25f70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
25f80 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25f90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25fa0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
25fb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25fc0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
25fd0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
25fe0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25ff0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
26000 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
26010 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
26020 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
26030 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
26040 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
26050 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
26060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26070 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
26080 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
26090 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
260a0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
260b0 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
260c0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
260d0 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
260e0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
260f0 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
26100 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
26110 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
26120 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
26130 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
26140 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
26150 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
26160 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
26170 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
26180 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
26190 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
261a0 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
261b0 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
261c0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
261d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
261e0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
261f0 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
26200 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
26210 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
26220 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
26230 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
26240 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
26250 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
26260 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
26270 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
26280 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
26290 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
262a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
262b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
262c0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
262d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26300 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
26310 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
26320 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
26330 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
26340 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
26350 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
26360 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
26370 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
26380 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
26390 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
263a0 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
263b0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
263c0 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
263d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
263e0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
263f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
26400 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
26410 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
26420 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
26430 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
26440 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
26450 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
26460 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
26470 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
26480 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
26490 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
264a0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
264b0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
264c0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
264d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
264e0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
264f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
26500 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
26510 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
26520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26530 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
26540 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26550 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
26560 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
26570 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
26580 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
26590 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
265a0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
265b0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
265c0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
265d0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
265e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
265f0 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
26600 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
26610 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
26620 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
26630 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
26640 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
26650 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
26660 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
26670 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
26680 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
26690 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
266a0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
266b0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
266c0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
266d0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
266e0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
266f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26700 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
26710 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
26720 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
26730 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
26740 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
26750 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
26760 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
26770 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
26780 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
26790 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
267a0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
267b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
267c0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
267d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
267e0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
267f0 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
26800 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
26810 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
26820 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
26830 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
26840 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
26850 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
26860 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
26870 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
26880 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
26890 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
268a0 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
268b0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
268c0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
268d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
268e0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
268f0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
26900 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
26910 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
26920 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
26930 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
26940 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
26950 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
26960 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
26970 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
26980 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
26990 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
269a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
269b0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
269c0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
269d0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
269e0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
269f0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
26a00 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
26a10 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
26a20 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
26a30 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
26a40 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
26a50 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
26a60 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26a70 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
26a80 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
26a90 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
26aa0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
26ab0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
26ac0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
26ad0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
26ae0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26af0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
26b00 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
26b10 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
26b20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
26b30 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
26b40 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
26b50 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
26b60 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
26b70 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
26b80 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
26b90 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
26ba0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
26bb0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
26bc0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
26bd0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
26be0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
26bf0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
26c00 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
26c10 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
26c20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26c30 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26c40 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26c50 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26c60 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
26c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
26c80 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
26c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
26ca0 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
26cb0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
26cc0 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
26cd0 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
26ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
26cf0 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
26d00 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
26d10 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
26d20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
26d30 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
26d40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
26d50 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
26d60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
26d70 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
26d80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26d90 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
26da0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
26db0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
26dc0 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
26dd0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
26de0 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
26df0 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
26e00 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
26e10 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
26e20 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
26e30 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
26e40 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
26e50 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
26e60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
26e70 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
26e80 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
26e90 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
26ea0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
26eb0 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
26ec0 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
26ed0 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
26ee0 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
26ef0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
26f00 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
26f10 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
26f20 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
26f30 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
26f40 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
26f50 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
26f60 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
26f70 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
26f80 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
26f90 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
26fa0 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
26fb0 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
26fc0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
26fd0 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
26fe0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26ff0 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
27000 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
27010 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
27020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
27030 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
27040 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
27050 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
27060 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
27070 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27080 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
27090 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
270a0 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
270b0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
270c0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
270d0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
270e0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
270f0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
27100 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
27110 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
27120 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
27130 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
27140 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
27150 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
27160 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
27170 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
27180 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
27190 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
271a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
271b0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
271c0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
271d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
271e0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
271f0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
27200 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
27210 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
27220 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
27230 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
27240 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
27250 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
27260 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
27270 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
27280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27290 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
272a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
272b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
272c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
272d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
272e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
272f0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
27300 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
27310 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
27320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27330 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
27340 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
27350 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
27360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
27370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27380 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
27390 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
273a0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
273b0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
273c0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
273d0 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
273e0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
273f0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
27400 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
27410 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
27420 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
27430 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
27440 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
27450 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
27460 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
27470 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
27480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
27490 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
274a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
274b0 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
274c0 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
274d0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
274e0 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
274f0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
27500 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
27510 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
27520 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
27530 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
27540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27550 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
27560 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
27570 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
27580 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
27590 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
275a0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
275b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
275c0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
275d0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
27600 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
27610 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
27620 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
27630 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
27640 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
27650 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
27660 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
27670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
27680 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
27690 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
276a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
276b0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
276c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
276d0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
276e0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
276f0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27700 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
27710 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
27720 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
27730 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38  Pager->nExtra>=8
27740 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
27750 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b  ->pExtra, 0, 8);
27760 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27770 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
27780 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
27790 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
277a0 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
277b0 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
277c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
277d0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
277e0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
277f0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
27800 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
27810 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
27820 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
27830 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
27840 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64  ->pExtra = (void
27850 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
27860 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d  >flags = PGHDR_M
27870 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  MAP;.    p->nRef
27880 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61   = 1;.    p->pPa
27890 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
278a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
278b0 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29  pExtra==(void *)
278c0 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72  &p[1] );.  asser
278d0 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29  t( p->pPage==0 )
278e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
278f0 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50  lags==PGHDR_MMAP
27900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27910 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
27920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27930 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d  nRef==1 );..  p-
27940 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
27950 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  p->pData = pData
27960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27970 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72  pOut++;..  retur
27980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
27990 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
279a0 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
279b0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
279c0 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
279d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
279e0 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
279f0 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
27a00 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
27a10 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
27a20 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
27a30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
27a40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
27a50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
27a60 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
27a70 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
27a80 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27a90 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
27aa0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
27ab0 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
27ac0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
27ad0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
27ae0 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
27af0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
27b00 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
27b10 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
27b20 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
27b30 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
27b40 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
27b50 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
27b60 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
27b70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
27b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
27b90 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
27ba0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27bb0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
27bc0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
27bd0 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
27be0 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
27bf0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
27c00 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
27c10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27c20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
27c30 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
27c40 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
27c50 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
27c60 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
27c70 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
27c80 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
27c90 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
27ca0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
27cb0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
27cc0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
27cd0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
27ce0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
27cf0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
27d00 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
27d10 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
27d20 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
27d30 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
27d40 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
27d50 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
27d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27d70 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
27d80 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
27d90 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
27da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27db0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
27dc0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
27dd0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
27de0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
27df0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
27e00 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
27e10 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
27e20 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
27e30 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
27e40 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
27e50 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
27e60 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27e70 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
27e80 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
27e90 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
27ea0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
27eb0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
27ec0 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
27ed0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
27ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  ..  assert( db |
27ef0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
27f00 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
27f10 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
27f20 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
27f30 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
27f40 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27f50 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
27f60 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
27f70 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
27f80 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
27f90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
27fa0 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
27fb0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
27fc0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
27fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
27fe0 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c  .  assert( db ||
27ff0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
28000 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
28010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
28020 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e  al, db, pPager->
28030 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  walSyncFlags, pP
28040 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
28050 20 20 20 20 20 20 28 64 62 20 26 26 20 28 64 62        (db && (db
28060 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
28070 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20  _NoCkptOnClose) 
28080 3f 20 30 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b  ? 0 : pTmp).  );
28090 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
280a0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
280b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
280c0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
280d0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
280e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
280f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
28100 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20  t is open, sync 
28110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28120 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
28130 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
28140 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  k..    ** If thi
28150 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74  s is not done, t
28160 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20  hen an unsynced 
28170 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  portion of the o
28180 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20  pen journal .   
28190 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20   ** file may be 
281a0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
281b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
281c0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
281d0 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a  e occurs .    **
281e0 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
281f0 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
28200 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63  tabase could bec
28210 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
28220 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e   **.    ** If an
28230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
28240 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79  ile trying to sy
28250 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  nc the journal, 
28260 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a  shift the pager.
28270 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
28280 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69  ERROR state. Thi
28290 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41  s causes UnlockA
282a0 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e  ndRollback to un
282b0 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20  lock the.    ** 
282c0 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f  database and clo
282d0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
282e0 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65  ile without atte
282f0 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
28300 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72  t.    ** back or
28310 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68   finalize it. Th
28320 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20  e next database 
28330 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74  user will have t
28340 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  o do hot-journal
28350 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
28360 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
28370 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
28380 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
28390 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
283a0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
283b0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
283c0 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f  ger, pagerSyncHo
283d0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
283e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
283f0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
28400 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
28410 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
28420 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
28430 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
28440 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
28450 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
28460 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
28470 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
28480 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
28490 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
284a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
284b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
284c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
284d0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
284e0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
284f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
28500 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
28510 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
28520 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
28530 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
28540 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
28550 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
28560 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
28570 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
28580 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
28590 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
285a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
285b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
285c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
285d0 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
285e0 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
285f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
28600 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
28610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
28620 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
28630 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
28640 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
28650 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
28660 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
28670 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
28680 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
28690 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
286a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
286b0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
286c0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
286d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
286e0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
286f0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
28700 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
28710 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
28720 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
28730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
28740 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
28750 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
28760 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
28770 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
28780 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
28790 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
287a0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
287b0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
287c0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
287d0 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
287e0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
287f0 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
28800 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
28810 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f   If the Pager.no
28820 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
28830 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
28840 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
28850 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
28860 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
28870 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
28880 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61  e journal-mode a
28890 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63  nd the .** devic
288a0 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
288b0 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  s of the file-sy
288c0 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
288d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
288e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
288f0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
28900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
28910 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
28920 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
28930 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
28940 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
28950 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
28960 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
28970 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
28980 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
28990 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
289a0 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
289b0 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
289c0 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
289d0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
289e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
289f0 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
28a00 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
28a10 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
28a20 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
28a30 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
28a40 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
28a50 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
28a60 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28a70 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
28a80 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
28a90 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
28aa0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
28ab0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
28ac0 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
28ad0 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
28ae0 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
28af0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
28b00 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
28b10 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
28b20 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
28b30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
28b40 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
28b50 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
28b60 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
28b70 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
28b80 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
28b90 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
28ba0 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
28bb0 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
28bc0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
28bd0 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
28be0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
28bf0 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
28c00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
28c10 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
28c20 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
28c30 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
28c40 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
28c50 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
28c60 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
28c70 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
28c80 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
28c90 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
28ca0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
28cb0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
28cc0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
28cd0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
28ce0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
28cf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
28d00 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
28d10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28d40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
28d50 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
28d60 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
28d70 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
28d80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
28d90 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
28da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
28db0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
28dc0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
28dd0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
28de0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
28df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28e00 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
28e10 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
28e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28e30 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
28e40 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
28e50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28e60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
28e70 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
28e80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28e90 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
28ea0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
28eb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
28ec0 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
28ed0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
28ee0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
28ef0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
28f00 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
28f10 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
28f20 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
28f30 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
28f40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
28f50 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
28f60 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
28f70 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
28f80 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
28f90 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
28fa0 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
28fb0 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
28fc0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
28fd0 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
28fe0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
28ff0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
29000 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
29010 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
29020 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
29030 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
29040 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
29050 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
29060 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
29070 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
29080 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
29090 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
290a0 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
290b0 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
290c0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
290d0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
290e0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
290f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
29100 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
29110 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
29120 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
29130 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
29140 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
29150 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
29160 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
29170 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
29180 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29190 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
291a0 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
291b0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
291c0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
291d0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
291e0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
291f0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
29200 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
29210 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
29220 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
29230 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
29240 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
29250 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
29260 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
29270 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
29280 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
29290 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
292a0 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
292b0 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
292c0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
292d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
292e0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
292f0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
29300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
29310 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
29320 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
29330 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
29340 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
29350 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
29360 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
29370 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
29380 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
29390 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
293a0 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
293b0 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
293c0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
293d0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
293e0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
293f0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
29400 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
29410 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
29420 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
29430 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
29440 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
29450 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
29460 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
29470 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
29480 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
29490 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
294a0 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
294b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
294c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
294d0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
294e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
294f0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
29500 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
29510 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
29520 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
29530 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
29540 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
29550 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
29560 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
29570 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
29580 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
29590 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
295a0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
295b0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
295c0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
295d0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
295e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
295f0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
29600 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
29610 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
29620 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
29630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29640 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
29650 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
29660 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
29670 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
29680 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
29690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
296a0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
296b0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
296c0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
296d0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
296e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
296f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
29700 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
29710 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
29720 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
29730 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
29740 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
29750 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
29760 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
29770 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
29780 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
29790 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
297a0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
297b0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
297c0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
297d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
297e0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
297f0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
29800 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
29810 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
29820 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
29830 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
29840 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
29850 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
29860 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
29870 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
29880 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
29890 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
298a0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
298b0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
298c0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
298d0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
298e0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
298f0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
29900 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
29910 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
29920 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
29930 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
29940 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
29950 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
29960 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
29970 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
29980 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
29990 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
299a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
299b0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
299c0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
299d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
299e0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
299f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29a00 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
29a10 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
29a20 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
29a30 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
29a40 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
29a50 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
29a60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29a70 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
29a80 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29a90 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
29aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29ab0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
29ad0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
29ae0 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
29af0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
29b00 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
29b10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29b20 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
29b30 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
29b40 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
29b50 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
29b60 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
29b70 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
29b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29b90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29ba0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
29bb0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29bc0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29bd0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
29be0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
29bf0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
29c00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
29c10 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
29c20 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
29c30 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29c50 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
29c60 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
29c70 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
29c80 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
29c90 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
29ca0 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
29cb0 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
29cc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29ce0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
29cf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
29d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29d10 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
29d20 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
29d30 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
29d40 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
29d50 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
29d60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29d70 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
29d80 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
29d90 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
29da0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29db0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29dc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29de0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29df0 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
29e00 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
29e10 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
29e20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
29e30 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
29e40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
29e50 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
29e60 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
29e70 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
29e80 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
29e90 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
29ea0 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
29eb0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
29ec0 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
29ed0 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
29ee0 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
29ef0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
29f00 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
29f10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
29f20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
29f30 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
29f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29f50 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
29f60 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
29f70 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
29f80 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
29f90 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
29fa0 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
29fb0 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
29fc0 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
29fd0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
29fe0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
29ff0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
2a000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2a010 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
2a020 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
2a030 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
2a040 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
2a050 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
2a060 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
2a070 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
2a080 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
2a090 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
2a0a0 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
2a0b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
2a0c0 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
2a0d0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
2a0e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a0f0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
2a100 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
2a110 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2a120 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
2a130 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
2a140 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
2a150 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
2a160 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
2a170 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2a180 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
2a190 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2a1a0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
2a1b0 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
2a1c0 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
2a1d0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
2a1e0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
2a1f0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
2a200 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
2a210 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
2a220 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
2a230 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
2a240 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
2a250 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
2a260 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
2a270 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
2a280 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
2a290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a2a0 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
2a2b0 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
2a2c0 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
2a2d0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
2a2e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2a2f0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
2a300 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
2a310 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
2a320 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
2a330 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
2a340 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
2a350 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
2a360 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
2a370 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
2a380 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
2a390 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a3a0 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
2a3b0 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
2a3c0 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
2a3d0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
2a3e0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
2a3f0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
2a400 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
2a410 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
2a420 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
2a430 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
2a440 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
2a450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a460 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
2a470 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a480 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
2a490 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2a4a0 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
2a4b0 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2a4c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a4d0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
2a4e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
2a4f0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
2a500 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
2a510 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2a520 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2a530 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2a540 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a550 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
2a560 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a570 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2a580 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a590 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2a5a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2a5b0 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
2a5c0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
2a5d0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
2a5e0 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
2a5f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
2a600 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
2a610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
2a620 70 46 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d  pFile || pPager-
2a630 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2a640 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
2a650 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a660 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
2a670 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
2a680 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2a690 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d  r->fd) || pList-
2a6a0 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  >pDirty==0 );.. 
2a6b0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2a6c0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
2a6d0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
2a6e0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
2a6f0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
2a700 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
2a710 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
2a720 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
2a730 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
2a740 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
2a750 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2a760 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
2a770 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
2a780 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
2a790 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2a7a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2a7b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
2a7c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2a7d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
2a7e0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
2a7f0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
2a800 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
2a810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
2a820 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
2a830 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
2a840 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
2a850 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
2a860 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
2a870 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2a890 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a8a0 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
2a8b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
2a8c0 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  & pPager->dbHint
2a8d0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
2a8e0 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74  ize.   && (pList
2a8f0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73  ->pDirty || pLis
2a900 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  t->pgno>pPager->
2a910 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b  dbHintSize).  ){
2a920 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
2a930 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
2a940 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
2a950 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
2a960 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2a970 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
2a980 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
2a990 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
2a9a0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
2a9b0 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61  szFile);.    pPa
2a9c0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
2a9d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2a9e0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
2a9f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2aa00 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
2aa10 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
2aa20 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
2aa30 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
2aa40 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
2aa50 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
2aa60 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
2aa70 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
2aa80 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
2aa90 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
2aaa0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
2aab0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
2aac0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
2aad0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
2aae0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
2aaf0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
2ab00 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
2ab10 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
2ab20 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
2ab30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ab40 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
2ab50 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
2ab60 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
2ab70 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
2ab80 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
2ab90 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
2aba0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
2abb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2abc0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
2abd0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
2abe0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
2abf0 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
2ac00 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2ac10 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
2ac20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
2ac30 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
2ac40 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
2ac50 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac80 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
2ac90 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65      ..      asse
2aca0 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67  rt( (pList->flag
2acb0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2acc0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  C)==0 );.      i
2acd0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
2ace0 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
2acf0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
2ad00 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ist);..      /* 
2ad10 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
2ad20 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
2ad30 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
2ad40 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
2ad50 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
2ad60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
2ad70 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
2ad80 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
2ad90 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
2ada0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2adb0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2adc0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
2add0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2ade0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2adf0 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
2ae00 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
2ae10 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
2ae20 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
2ae30 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
2ae40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
2ae50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2ae60 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
2ae70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
2ae80 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
2ae90 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
2aea0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
2aeb0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
2aec0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
2aed0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2aee0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
2aef0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
2af00 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2af10 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
2af20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2af30 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
2af40 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
2af50 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
2af60 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
2af70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2af80 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
2af90 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a  STAT_WRITE]++;..
2afa0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2afb0 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
2afc0 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
2afd0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
2afe0 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
2aff0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
2b000 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
2b010 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
2b020 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
2b030 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2b040 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
2b050 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
2b060 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b070 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2b080 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
2b090 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
2b0a0 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
2b0b0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
2b0c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
2b0d0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
2b0e0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
2b0f0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
2b100 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
2b110 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2b120 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
2b130 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2b140 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
2b150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
2b160 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
2b170 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
2b180 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
2b190 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
2b1a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
2b1b0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75  sure that the su
2b1c0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
2b1d0 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73  s open. If it is
2b1e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
2b1f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
2b200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2b210 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2b220 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
2b230 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
2b240 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
2b250 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
2b260 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
2b270 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
2b280 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2b290 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66  e3OsOpen() .** f
2b2a0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
2b2b0 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
2b2c0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2b2d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2b2e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
2b2f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2b300 6a 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  jfd) ){.    cons
2b310 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53  t int flags =  S
2b320 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
2b330 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  URNAL | SQLITE_O
2b340 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20  PEN_READWRITE . 
2b350 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2b360 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
2b370 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
2b380 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54  E .      | SQLIT
2b390 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2b3a0 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53  LOSE;.    int nS
2b3b0 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74  tmtSpill = sqlit
2b3c0 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70  e3Config.nStmtSp
2b3d0 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ill;.    if( pPa
2b3e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b3f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2b400 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
2b410 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
2b420 72 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d  ry ){.      nStm
2b430 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20  tSpill = -1;.   
2b440 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2b450 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  te3JournalOpen(p
2b460 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
2b470 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c  pPager->sjfd, fl
2b480 61 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29  ags, nStmtSpill)
2b490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b4a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
2b4b0 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
2b4c0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2b4d0 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
2b4e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2b4f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2b500 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
2b510 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
2b520 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
2b530 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
2b540 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
2b550 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
2b560 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2b570 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2b580 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
2b590 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2b5a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
2b5b0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
2b5c0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2b5d0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
2b5e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
2b5f0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
2b600 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
2b610 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
2b620 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
2b630 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
2b640 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
2b650 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2b660 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
2b670 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b680 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
2b690 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2b6a0 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
2b6b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2b6c0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b6d0 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
2b6e0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2b6f0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
2b700 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
2b710 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
2b720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b730 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2b740 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2b750 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2b760 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
2b770 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
2b780 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2b790 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
2b7a0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
2b7b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b7c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2b7d0 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
2b7e0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2b7f0 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20  ager, pPg) .    
2b800 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
2b810 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2b820 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
2b830 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2b840 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
2b850 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2b860 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
2b870 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
2b880 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
2b890 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
2b8a0 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
2b8b0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2b8c0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
2b8d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b8e0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
2b8f0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
2b900 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
2b910 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
2b920 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
2b930 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2b940 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
2b950 61 74 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ata2;..#if SQLIT
2b960 45 5f 48 41 53 5f 43 4f 44 45 43 20 20 20 0a 20  E_HAS_CODEC   . 
2b970 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2b980 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2b990 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  {.        CODEC2
2b9a0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2b9b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2b9c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b9d0 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b  M_BKPT, pData2);
2b9e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2b9f0 64 69 66 0a 20 20 20 20 20 20 70 44 61 74 61 32  dif.      pData2
2ba00 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
2ba10 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2ba20 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2ba30 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2ba40 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2ba50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2ba60 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2ba70 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2ba80 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2ba90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2baa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bab0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2bac0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2bad0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2bae0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2baf0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2bb00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2bb10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2bb30 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2bb40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2bb50 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2bb60 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2bb70 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2bb80 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2bb90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2bba0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
2bbb0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2bbc0 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70  equired(PgHdr *p
2bbd0 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52  Pg){.  if( subjR
2bbe0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2bbf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
2bc00 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2bc10 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2bc20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bc30 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
2bc40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2bc50 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2bc60 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
2bc70 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
2bc80 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
2bc90 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
2bca0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2bcb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bcc0 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
2bcd0 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
2bce0 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
2bcf0 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
2bd00 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
2bd10 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
2bd20 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
2bd30 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
2bd40 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
2bd50 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
2bd60 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
2bd70 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
2bd80 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
2bd90 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
2bda0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
2bdb0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
2bdc0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2bdd0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
2bde0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2bdf0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
2be00 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
2be10 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
2be20 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
2be30 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
2be40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2be50 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
2be60 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
2be70 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
2be80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
2be90 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2bea0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
2beb0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
2bec0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
2bed0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
2bee0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2bef0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2bf00 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2bf10 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
2bf20 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
2bf30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2bf40 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
2bf50 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
2bf60 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
2bf70 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
2bf80 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
2bf90 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2bfa0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2bfb0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2bfc0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2bfd0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2bfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bff0 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
2c000 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
2c010 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2c020 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
2c030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c040 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2c050 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
2c060 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
2c070 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2c080 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
2c090 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2c0a0 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73   NOSYNC bit is s
2c0b0 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
2c0c0 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
2c0d0 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
2c0e0 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
2c0f0 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
2c100 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
2c110 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
2c120 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
2c130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c140 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
2c150 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
2c160 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
2c170 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
2c180 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
2c190 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
2c1a0 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  pill ROLLBACK an
2c1b0 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62  d OFF bits inhib
2c1c0 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
2c1d0 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61  illing.  ** rega
2c1e0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2c1f0 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  r or not a sync 
2c200 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
2c210 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
2c220 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b  .  ** a rollback
2c230 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75   or by user requ
2c240 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  est, respectivel
2c250 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  y..  **.  ** Spi
2c260 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
2c270 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
2c280 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
2c290 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
2c2a0 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
2c2b0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2c2c0 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
2c2d0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2c2e0 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2c2f0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2c300 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2c310 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2c320 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2c330 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =3.  ** while in
2c340 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c350 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2c360 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2c370 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2c380 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2c390 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2c3a0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2c3b0 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2c3c0 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2c3d0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2c3e0 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2c3f0 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2c400 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2c410 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2c420 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2c430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c440 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2c450 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c460 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2c470 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  CK );.  testcase
2c480 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2c490 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2c4a0 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61  _OFF );.  testca
2c4b0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2c4c0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2c4d0 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69  AG_NOSYNC );.  i
2c4e0 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2c4f0 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50  Spill.   && ((pP
2c500 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c510 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   & (SPILLFLAG_RO
2c520 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47  LLBACK|SPILLFLAG
2c530 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20  _OFF))!=0.      
2c540 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  || (pPg->flags &
2c550 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2c560 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  )!=0).  ){.    r
2c570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c580 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2c590 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2c5a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2c5b0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2c5c0 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2c5d0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2c5e0 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2c5f0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2c600 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2c610 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20  (pPg); .    if( 
2c620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c630 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c640 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2c650 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2c660 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c670 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
2c680 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
2c690 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69  OMIC_WRITE.    i
2c6a0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
2c6b0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2c6c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2c6d0 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
2c6e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
2c6f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c700 29 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65  ) return pager_e
2c710 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2c720 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2c730 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2c740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2c750 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2c760 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2c770 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2c780 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2c790 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2c7a0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2c7b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2c7c0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2c7d0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2c7e0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2c7f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2c800 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2c810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c820 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2c830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2c850 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c860 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2c870 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c880 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2c890 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2c8a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2c8b0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2c8c0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2c8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c8e0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2c8f0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2c900 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2c910 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2c920 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2c930 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2c940 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2c950 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2c960 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2c970 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2c980 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2c990 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2c9a0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2c9b0 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2c9c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2c9d0 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2c9e0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2c9f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2ca00 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2ca10 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2ca20 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2ca30 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2ca40 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2ca50 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2ca60 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2ca70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2ca80 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2ca90 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2caa0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2cab0 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2cac0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cad0 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2cae0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2caf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2cb00 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2cb10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2cb20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2cb30 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2cb40 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2cb50 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2cb60 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2cb70 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2cb80 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2cb90 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2cba0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2cbb0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2cbc0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2cbd0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2cbe0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2cbf0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2cc00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cc10 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2cc20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2cc30 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2cc40 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2cc50 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2cc60 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2cc70 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2cc80 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2cc90 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2cca0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2ccb0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2ccc0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2ccd0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2cce0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2ccf0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2cd00 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2cd10 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2cd20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2cd30 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2cd40 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2cd50 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2cd60 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2cd70 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2cd80 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2cd90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2cda0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2cdb0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2cdc0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2cdd0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2cde0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2cdf0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2ce00 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2ce10 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2ce20 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2ce30 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2ce40 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2ce50 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2ce60 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2ce70 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2ce80 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2ce90 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2cea0 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2ceb0 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2cec0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2ced0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2cee0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2cef0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2cf00 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2cf10 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2cf20 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2cf30 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2cf40 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2cf50 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2cf60 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2cf70 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2cf80 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2cf90 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2cfa0 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2cfb0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2cfc0 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2cfd0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2cfe0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2cff0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2d000 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2d010 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2d020 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2d030 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2d040 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2d050 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2d060 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d070 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2d080 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2d090 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2d0a0 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2d0b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2d0c0 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2d0d0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2d0e0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2d0f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2d100 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2d110 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2d120 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2d130 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2d140 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2d150 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2d160 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2d170 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2d180 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2d190 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2d1a0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2d1b0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2d1c0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2d1d0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2d1e0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2d1f0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2d200 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2d210 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2d220 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2d230 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2d240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d250 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2d260 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2d270 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2d280 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2d290 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2d2a0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2d2b0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2d2c0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2d2d0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2d2e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2d2f0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2d300 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2d310 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2d320 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2d330 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2d340 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2d350 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2d360 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2d370 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2d380 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2d390 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2d3a0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2d3b0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2d3c0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2d3d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d3e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d3f0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2d400 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2d410 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2d420 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2d430 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2d440 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2d450 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2d460 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2d470 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2d480 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d 20   */.  int memJM 
2d490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2d4a0 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  * Memory journal
2d4b0 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72   mode */.  int r
2d4c0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2d4d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2d4e0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2d4f0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2d500 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d510 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2d520 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2d530 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2d540 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2d550 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2d560 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2d570 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2d580 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2d590 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2d5a0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2d5b0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2d5c0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2d5d0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2d5e0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2d5f0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2d600 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2d610 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
2d620 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2d630 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
2d640 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2d650 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
2d660 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  32 szPageDflt = 
2d670 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d680 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
2d690 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d6a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2d6b0 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a  *zUri = 0;    /*
2d6c0 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70   URI args to cop
2d6d0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20  y */.  int nUri 
2d6e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2d700 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61  es of URI args a
2d710 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a  t *zUri */..  /*
2d720 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2d730 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2d740 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2d750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2d760 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2d770 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2d780 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2d790 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2d7a0 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f  urnal).  */.  jo
2d7b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2d7c0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2d7d0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2d7e0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
2d7f0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2d800 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2d810 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2d820 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2d830 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2d840 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2d850 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2d860 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2d870 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2d880 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
2d890 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2d8a0 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   ){.      zPathn
2d8b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
2d8c0 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61  trDup(0, zFilena
2d8d0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
2d8e0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72  Pathname==0  ) r
2d8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d900 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e  EM_BKPT;.      n
2d910 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d920 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2d930 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2d940 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2d950 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2d960 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2d970 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2d980 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2d990 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2d9a0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2d9b0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2d9c0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2d9d0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2d9e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2d9f0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2da00 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2da10 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2da20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2da30 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2da40 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2da50 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2da60 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2da70 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2da80 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2da90 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2daa0 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2dab0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2dac0 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2dad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dae0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2daf0 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2db00 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2db10 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2db20 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2db30 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2db40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2db50 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2db60 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2db70 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2db80 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2db90 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2dba0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2dbb0 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2dbc0 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2dbd0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2dbe0 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2dbf0 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2dc00 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2dc10 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2dc20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2dc30 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2dc40 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2dc50 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2dc60 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2dc70 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2dc80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dc90 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2dca0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2dcb0 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2dcc0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2dcd0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2dce0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2dcf0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2dd00 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2dd10 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2dd20 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2dd30 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2dd40 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2dd50 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2dd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2dd70 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2dd80 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2dd90 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2dda0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2ddb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2ddc0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2ddd0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2dde0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2ddf0 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2de00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2de10 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2de20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2de30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2de40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2de50 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2de60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2de70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2de80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2de90 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2dea0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2deb0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2dec0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2ded0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2dee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2def0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2df00 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2df10 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2df20 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2df30 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2df40 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2df50 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2df60 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2df70 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2df80 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2df90 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2dfa0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2dfb0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2dfc0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2dfd0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2dfe0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2dff0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2e000 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2e010 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2e020 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2e030 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2e040 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2e050 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2e060 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2e070 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2e080 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2e090 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2e0b0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2e0c0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2e0d0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2e0e0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2e0f0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2e100 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2e110 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2e120 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2e130 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2e140 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2e150 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2e160 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2e170 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2e180 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2e190 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2e1a0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2e1b0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2e1c0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2e1d0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2e1e0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2e1f0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2e200 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2e210 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2e220 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2e230 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2e240 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2e250 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2e260 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2e270 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2e280 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2e290 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2e2a0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2e2b0 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2e2c0 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2e2d0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2e2e0 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2e2f0 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2e300 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2e310 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2e320 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2e330 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2e340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e350 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
2e360 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2e370 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2e380 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2e390 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2e3a0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2e3b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2e3c0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2e3d0 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2e3e0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e3f0 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2e400 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2e410 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2e420 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2e430 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2e440 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2e450 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2e460 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e470 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2e480 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2e490 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2e4a0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2e4b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2e4c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2e4d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2e4e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2e4f0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2e500 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2e510 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2e520 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2e530 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2e540 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2e550 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2e560 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2e570 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2e580 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2e590 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2e5a0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2e5b0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2e5c0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2e5d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2e5e0 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d      if( nUri ) m
2e5f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2e600 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
2e610 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72  me+1], zUri, nUr
2e620 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2e630 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2e640 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2e650 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2e660 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
2e670 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
2e680 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c   "-journal\000",
2e690 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74   8+2);.    sqlit
2e6a0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2e6b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2e6c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2e6d0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2e6e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2e6f0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2e700 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e710 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2e720 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2e730 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
2e740 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2e750 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2e760 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
2e770 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22  ame], "-wal\000"
2e780 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  , 4+1);.    sqli
2e790 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2e7a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e7b0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  , pPager->zWal);
2e7c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
2e7d0 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2e7e0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
2e7f0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
2e800 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
2e810 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
2e820 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
2e830 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
2e840 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2e850 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2e860 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  0] ){.    int fo
2e870 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2e880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2e890 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2e8a0 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2e8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2e8c0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2e8d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2e8e0 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2e8f0 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2e900 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20   assert( !memDb 
2e910 29 3b 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28  );.    memJM = (
2e920 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2e930 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 20 20 20  _MEMORY)!=0;.   
2e940 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2e950 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2e960 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  ADONLY)!=0;..   
2e970 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2e980 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2e990 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2e9a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2e9b0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2e9c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2e9d0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2e9e0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2e9f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2ea00 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2ea10 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2ea20 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2ea30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2ea40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ea50 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2ea60 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2ea70 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2ea80 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2ea90 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2eaa0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2eab0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2eac0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2ead0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2eae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2eaf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2eb00 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2eb10 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2eb20 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2eb30 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2eb40 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2eb50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2eb60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2eb70 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2eb80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2eb90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2eba0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2ebb0 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2ebc0 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2ebd0 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2ebe0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2ebf0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2ec00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2ec10 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2ec20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2ec30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2ec40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ec50 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2ec60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ec70 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2ec80 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2ec90 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2eca0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2ecb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2ecc0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2ecd0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2ece0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2ecf0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2ed00 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2ed10 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2ed20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ed30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2ed40 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2ed50 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2ed60 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2ed70 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ed80 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2ed90 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2eda0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2edb0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2edc0 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2edd0 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2ede0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2edf0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2ee00 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2ee10 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2ee20 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2ee30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ee40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2ee50 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2ee60 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2ee70 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2ee80 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2ee90 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2eea0 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2eeb0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2eec0 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2eed0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2eee0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2eef0 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2ef00 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2ef10 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2ef20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2ef30 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2ef40 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2ef50 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2ef60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ef70 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2ef80 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2ef90 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2efa0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2efb0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2efc0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2efd0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2efe0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2eff0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2f000 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2f010 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2f020 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2f030 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2f040 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2f050 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2f060 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2f070 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2f080 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2f090 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2f0a0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2f0b0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2f0c0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2f0d0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2f0e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2f0f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2f100 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f110 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2f120 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2f130 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2f140 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2f150 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2f160 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2f170 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2f180 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2f190 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2f1a0 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2f1b0 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2f1c0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2f1d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2f1e0 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2f1f0 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2f200 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2f210 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2f220 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f230 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2f240 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2f250 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2f260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f270 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2f280 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2f290 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2f2a0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2f2b0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2f2c0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2f2d0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2f2e0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2f2f0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2f300 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2f310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f320 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2f330 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2f340 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f350 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2f360 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2f370 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2f380 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2f390 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2f3a0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2f3b0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2f3c0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2f3d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f3e0 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2f3f0 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61  8(nExtra);.    a
2f400 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38  ssert( nExtra>=8
2f410 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20   && nExtra<1000 
2f420 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2f430 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2f440 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2f450 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f470 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2f480 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2f490 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2f4a0 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2f4b0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2f4c0 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2f4d0 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2f4e0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2f4f0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2f500 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2f510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2f520 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2f530 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2f540 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2f550 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2f560 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2f570 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2f580 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2f590 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2f5a0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2f5b0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2f5c0 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2f5d0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2f5e0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2f5f0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2f600 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f610 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2f620 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2f630 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2f640 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2f650 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f660 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2f670 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f680 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2f690 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2f6a0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2f6b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f6c0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2f6d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2f6e0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2f6f0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2f700 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2f710 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2f720 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2f730 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2f740 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2f750 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2f760 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2f770 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2f780 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2f790 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2f7a0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2f7b0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2f7c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2f7d0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2f7e0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2f7f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2f800 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2f810 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2f820 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2f830 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2f840 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2f850 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2f860 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2f870 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2f880 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2f890 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2f8a0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2f8b0 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2f8c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2f8d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2f8e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f8f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2f900 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2f910 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2f920 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2f930 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f940 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
2f950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f960 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2f970 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f980 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2f990 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2f9a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2f9b0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2f9c0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
2f9d0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
2f9e0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2f9f0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2fa00 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
2fa10 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
2fa20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2fa30 4d 41 4c 20 7c 20 28 53 51 4c 49 54 45 5f 53 59  MAL | (SQLITE_SY
2fa40 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32 29 3b 0a 20  NC_NORMAL<<2);. 
2fa50 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2fa60 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2fa70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2fa80 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2fa90 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2faa0 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2fab0 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2fac0 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2fad0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2fae0 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2faf0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2fb00 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2fb10 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2fb20 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2fb30 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2fb40 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2fb50 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2fb60 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2fb70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2fb80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2fb90 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2fba0 66 28 20 6d 65 6d 44 62 20 7c 7c 20 6d 65 6d 4a  f( memDb || memJ
2fbb0 4d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  M ){.    pPager-
2fbc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2fbd0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2fbe0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2fbf0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2fc00 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2fc10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2fc20 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2fc30 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2fc40 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2fc50 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65  t;.  setGetterMe
2fc60 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
2fc70 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2fc80 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2fc90 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2fca0 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2fcb0 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
2fcc0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2fcd0 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
2fce0 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2fcf0 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2fd00 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2fd10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2fd20 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2fd30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fd40 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
2fd50 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
2fd60 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
2fd70 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
2fd80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2fd90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2fda0 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20  s still were it 
2fdb0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
2fdc0 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
2fdd0 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
2fde0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2fdf0 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
2fe00 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
2fe10 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
2fe20 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
2fe30 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
2fe40 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
2fe50 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
2fe60 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
2fe70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
2fe80 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
2fe90 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
2fea0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2feb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fec0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2fed0 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
2fee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2fef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ff00 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
2ff10 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2ff20 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
2ff30 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2ff40 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
2ff50 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
2ff60 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
2ff70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2ff80 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
2ff90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
2ffa0 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
2ffb0 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
2ffc0 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
2ffd0 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
2ffe0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
2fff0 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
30000 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
30010 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
30020 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
30030 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
30040 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
30050 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
30060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
30070 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
30080 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
30090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
300a0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
300b0 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
300c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
300d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
300e0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
300f0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
30100 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
30110 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
30120 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
30130 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
30140 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
30150 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
30160 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
30170 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
30180 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
30190 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
301a0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
301b0 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
301c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
301d0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
301e0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
301f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30200 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
30210 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
30220 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30230 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
30240 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
30250 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
30260 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
30270 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
30280 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30290 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
302a0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
302b0 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
302c0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
302d0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
302e0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
302f0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
30300 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
30310 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
30320 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
30330 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
30340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30350 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
30360 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
30370 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
30380 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
30390 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
303a0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
303b0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
303c0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
303d0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
303e0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
303f0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
30400 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
30410 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
30420 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
30430 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
30440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
30450 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
30460 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
30470 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
30480 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
30490 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
304a0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
304b0 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
304c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
304d0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
304e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
304f0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30500 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
30510 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
30520 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
30530 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
30540 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
30550 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
30560 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
30570 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30580 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
30590 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
305a0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
305b0 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
305c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
305d0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
305e0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
305f0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
30600 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
30610 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
30620 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
30630 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
30640 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
30650 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
30660 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
30670 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
30680 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
30690 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
306a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
306b0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
306c0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
306d0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
306e0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
306f0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
30700 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
30710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
30720 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
30730 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
30740 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
30750 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
30760 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
30770 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
30780 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30790 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
307a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
307b0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
307c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
307d0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
307e0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
307f0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
30800 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
30810 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
30820 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
30830 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
30840 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
30850 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
30860 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30870 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
30880 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
30890 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
308a0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
308b0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
308c0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
308d0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
308e0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
308f0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
30900 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
30910 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
30920 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
30930 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
30940 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
30950 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30960 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
30970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30980 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
30990 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
309a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
309b0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
309c0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
309d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
309e0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
309f0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
30a00 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
30a10 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
30a20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
30a30 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
30a40 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
30a50 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
30a60 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
30a70 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
30a80 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
30a90 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
30aa0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
30ab0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
30ac0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
30ad0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
30ae0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30af0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
30b00 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
30b10 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
30b20 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
30b30 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
30b40 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
30b50 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
30b60 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
30b70 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
30b80 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
30b90 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
30ba0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
30bb0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
30bc0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
30bd0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
30be0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
30bf0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
30c00 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
30c10 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
30c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30c30 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
30c40 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
30c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30c60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
30c70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
30c80 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
30c90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30ca0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20  tempFile==0 );. 
30cb0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
30cc0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
30cd0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
30ce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30cf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
30d00 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30d10 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e  is zero pages in
30d20 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e   size, that mean
30d30 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31  s that either (1
30d40 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  ) the.        **
30d50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65   journal is a re
30d60 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69  mnant from a pri
30d70 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68  or database with
30d80 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77   the same name w
30d90 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
30da0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30db0 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f  e but not the jo
30dc0 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65  urnal was delete
30dd0 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e  d, or (2) the in
30de0 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  itial.        **
30df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
30e00 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65  t populates a ne
30e10 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  w database is be
30e20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
30e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65  .        ** In e
30e40 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20  ither case, the 
30e50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
30e60 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f   be deleted.  Ho
30e70 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65  wever, take care
30e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
30e90 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
30ea0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
30eb0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
30ec0 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20   due to.        
30ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ** journal_mode=
30ee0 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20  PERSIST..       
30ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30f00 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e  nPage==0 && !jrn
30f10 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30f20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
30f30 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
30f40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67           if( pag
30f50 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
30f60 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
30f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30f90 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
30fa0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30fb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30fc0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
30fd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70  xclusiveMode ) p
30fe0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
30ff0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31020 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
31030 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
31040 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
31050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31060 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
31070 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
31080 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
31090 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
310a0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
310b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
310c0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
310d0 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
310e0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
310f0 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
31100 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
31110 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
31120 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
31130 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
31140 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
31150 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
31160 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
31170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
31180 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
31190 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
311a0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
311b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
311c0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
311d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
311e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
311f0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
31200 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31210 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31220 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31230 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31240 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
31250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
31260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
31280 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
31290 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
312a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
312b0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
312c0 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
312d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
312e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
312f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
31300 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31330 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
31340 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
31350 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
31360 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
31370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31380 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31390 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
313a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
313b0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
313c0 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
313d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
313e0 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
313f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
31400 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
31410 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
31420 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
31430 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
31440 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
31450 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
31460 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
31470 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
31480 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
31490 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
314a0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
314b0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
314c0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
314d0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
314e0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
314f0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
31500 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
31510 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
31520 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
31530 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
31540 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
31550 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
31560 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
31570 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
31580 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
31590 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
315a0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
315b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
315c0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
315d0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
315e0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
315f0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
31600 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
31610 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31620 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
31630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
31640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31670 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
31680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
31690 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
316a0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
316b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
316c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
316d0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
316e0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
316f0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e  te3PagerGet() un
31700 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
31710 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
31720 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
31730 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
31740 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
31750 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
31760 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
31770 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
31780 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
31790 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
317a0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
317b0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
317c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
317d0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
317e0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
317f0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
31800 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
31810 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
31820 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31830 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
31840 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
31850 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
31860 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
31870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31880 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
31890 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
318a0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
318b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
318c0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
318d0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
318e0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
318f0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
31900 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
31910 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
31920 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
31930 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
31940 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
31950 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
31960 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
31970 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
31980 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
31990 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
319a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
319b0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
319c0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
319d0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
319e0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
319f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
31a00 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
31a10 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
31a20 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
31a30 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
31a40 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
31a50 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
31a60 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
31a70 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
31a80 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
31a90 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31aa0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
31ab0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
31ac0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
31ad0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31ae0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
31af0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
31b00 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
31b10 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
31b20 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
31b30 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
31b40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
31b50 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
31b60 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
31b70 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
31b80 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
31b90 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
31ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
31bb0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
31bc0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
31bd0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
31be0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31c00 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
31c10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
31c20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31c30 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
31c40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
31c50 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
31c60 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
31c70 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
31c80 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
31c90 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
31ca0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
31cb0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
31cc0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
31cd0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
31ce0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
31cf0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
31d00 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
31d10 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
31d20 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
31d30 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
31d40 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ccess mode.  */.
31d50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31d60 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
31d70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
31d80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
31d90 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31da0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
31db0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31dc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31dd0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
31de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
31df0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
31e00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
31e20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
31e30 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
31e40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31e50 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
31e60 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
31e70 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
31e80 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
31e90 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
31ea0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
31eb0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
31ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31ed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
31ee0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
31ef0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
31f00 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  OCK );..    rc =
31f10 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
31f20 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
31f30 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
31f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31f50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31f60 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31f70 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
31f80 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
31f90 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
31fa0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31fb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
31fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31fd0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
31fe0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
31ff0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
32000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32010 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
32020 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
32030 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
32040 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
32050 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
32060 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
32070 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
32080 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
32090 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
320a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
320b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
320c0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
320d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
320e0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
320f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
32100 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
32110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32120 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
32130 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
32140 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
32150 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
32160 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
32170 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32180 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
32190 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
321a0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
321b0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
321c0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
321d0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
321e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
321f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
32200 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
32210 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
32220 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
32230 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
32240 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
32250 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
32260 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
32270 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32280 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
32290 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
322a0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
322b0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
322c0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
322d0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
322e0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
322f0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
32300 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
32310 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
32320 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
32330 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
32340 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
32350 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
32360 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
32370 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
32380 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
32390 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
323a0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
323b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
323c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
323d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
323e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
323f0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
32400 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
32410 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
32420 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
32430 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
32440 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
32450 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
32460 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
32470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
32480 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
32490 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
324a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
324b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
324c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
324d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
324e0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
324f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
32500 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
32510 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
32520 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
32530 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
32540 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
32550 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
32560 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
32570 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
32580 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
32590 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
325a0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
325b0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
325c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
325d0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
325e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
325f0 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
32600 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
32610 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
32620 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
32630 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
32640 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
32650 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
32660 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
32670 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
32680 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
32690 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
326a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
326b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
326c0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
326d0 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
326e0 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
326f0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
32700 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
32710 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
32720 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
32730 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
32740 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
32750 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
32760 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
32770 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
32780 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
32790 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
327a0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
327b0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
327c0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
327d0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
327e0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
327f0 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
32800 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
32810 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32830 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
32840 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
32850 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
32860 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
32870 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
32880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
32890 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
328a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
328b0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
328c0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
328d0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
328e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
328f0 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
32900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32910 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
32920 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32930 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
32940 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
32950 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
32960 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
32970 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
32980 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
32990 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
329a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
329b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
329c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
329d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
329e0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
329f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32a10 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32a20 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
32a30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32a40 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
32a50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
32a60 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
32a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
32a80 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
32a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
32aa0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
32ab0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
32ac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ad0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
32ae0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
32af0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
32b00 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
32b10 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
32b20 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
32b30 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
32b40 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
32b50 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
32b60 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
32b70 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
32b80 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
32b90 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
32ba0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
32bb0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
32bc0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
32bd0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
32be0 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
32bf0 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
32c00 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
32c10 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
32c20 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
32c30 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
32c40 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
32c50 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
32c60 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
32c70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
32c80 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
32c90 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
32ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32cb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32cc0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
32cd0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32ce0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
32cf0 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
32d00 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
32d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32d30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
32d40 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
32d50 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65  ger, !pPager->te
32d60 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  mpFile);.       
32d70 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32d80 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
32d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32da0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
32db0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32dd0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
32de0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32df0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32e00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32e10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32e20 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
32e30 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
32e40 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
32e50 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
32e60 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
32e70 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
32e80 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
32e90 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32ea0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
32eb0 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
32ec0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
32ed0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
32ee0 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
32ef0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
32f00 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
32f10 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
32f20 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
32f30 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
32f40 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
32f50 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
32f60 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
32f70 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
32f80 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
32f90 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
32fa0 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
32fb0 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
32fc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
32fd0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
32fe0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
32ff0 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
33000 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
33010 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
33020 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
33030 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
33040 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
33050 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
33060 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
33070 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
33080 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
33090 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
330a0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
330b0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
330c0 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
330d0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
330e0 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
330f0 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
33100 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
33110 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
33120 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
33130 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
33140 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
33150 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
33160 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
33170 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
33180 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
33190 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
331a0 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
331b0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
331c0 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
331d0 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
331e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
331f0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
33200 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
33210 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
33220 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
33230 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33240 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
33250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
33260 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
33270 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
33280 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
33290 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
332a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
332b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
332c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
332d0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
332e0 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67  tempFile && pPag
332f0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33300 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  dLock ){.      /
33310 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
33320 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
33330 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68  acquired then ch
33340 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
33350 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
33360 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
33370 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
33380 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
33390 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ged,.      ** fl
333a0 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
333b0 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65  The hasHeldShare
333c0 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65  dLock flag preve
333d0 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
333e0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
333f0 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
33400 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
33410 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
33420 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
33430 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
33440 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
33450 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
33460 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
33470 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
33480 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
33490 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
334a0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
334b0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
334c0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
334d0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
334e0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
334f0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
33500 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
33510 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
33520 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
33530 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
33540 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
33550 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
33560 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
33570 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
33580 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
33590 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
335a0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
335b0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
335c0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
335d0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
335e0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
335f0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
33600 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
33610 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
33620 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
33630 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
33640 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
33650 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
33660 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
33670 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
33680 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
33690 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49  Vers)];..      I
336a0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
336b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
336c0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
336d0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63  ers)));.      rc
336e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
336f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
33700 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
33710 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
33720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33740 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33750 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
33760 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
33770 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
33780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33790 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
337a0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
337b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
337c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
337d0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
337e0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
337f0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33800 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
33810 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
33820 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
33830 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
33840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33850 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
33860 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
33870 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
33880 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
33890 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
338a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
338b0 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
338c0 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
338d0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
338e0 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
338f0 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
33900 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
33910 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
33920 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
33930 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
33940 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
33950 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
33960 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
33970 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
33980 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
33990 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
339a0 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
339b0 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
339c0 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
339d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
339e0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
339f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33a00 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33a10 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
33a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
33a40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
33a50 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
33a60 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
33a70 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
33a80 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
33a90 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
33aa0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
33ab0 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
33ac0 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
33ad0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
33ae0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
33af0 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
33b00 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
33b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33b20 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
33b30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
33b40 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
33b50 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33b60 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
33b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33b80 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
33b90 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
33ba0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
33bb0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
33bc0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26  ->tempFile==0 &&
33bd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33be0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
33bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33c00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
33c10 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
33c20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
33c30 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
33c40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
33c60 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
33c70 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
33c80 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
33c90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33ca0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
33cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
33cc0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33cd0 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
33ce0 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
33cf0 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a  SharedLock = 1;.
33d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
33d20 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
33d30 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
33d40 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
33d50 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
33d60 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
33d70 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
33d80 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
33d90 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
33da0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
33db0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
33dc0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
33dd0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
33de0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
33df0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
33e00 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
33e10 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
33e20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
33e30 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
33e40 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
33e50 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
33e60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
33e70 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
33e80 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
33e90 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Cache)==0 ){.   
33ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33eb0 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20  >nMmapOut==0 ); 
33ec0 2f 2a 20 62 65 63 61 75 73 65 20 70 61 67 65 31  /* because page1
33ed0 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
33ee0 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70   mapped */.    p
33ef0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
33f00 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
33f10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
33f20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68  page getter meth
33f30 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20  ods each try to 
33f40 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  acquire a refere
33f50 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65  nce to a.** page
33f60 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
33f70 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72  r pgno. If the r
33f80 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
33f90 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
33fa0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
33fb0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
33fc0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
33fd0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
33fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
33ff0 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65   different imple
34000 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
34010 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
34020 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
34030 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
34040 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  e of the pager..
34050 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  **.**     getPag
34060 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20  eNormal()       
34070 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c    --  The normal
34080 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67   getter.**     g
34090 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20  etPageError()   
340a0 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
340b0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
340c0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
340d0 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  e.**     getPage
340e0 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20  Mmap()          
340f0 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d   --  Used if mem
34100 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
34110 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20  s enabled.**.** 
34120 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
34130 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
34140 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
34150 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
34160 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
34170 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
34180 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
34190 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
341a0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
341b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
341c0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
341d0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
341e0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
341f0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
34200 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
34210 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
34220 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
34230 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
34240 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
34250 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
34260 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
34270 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
34280 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
34290 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
342a0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
342b0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
342c0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
342d0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
342e0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
342f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
34300 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
34310 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
34320 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
34330 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
34340 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
34350 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
34360 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
34370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
34380 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
34390 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
343a0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
343b0 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67   if .** the flag
343c0 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
343d0 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47  ains the PAGER_G
343e0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74  ET_NOCONTENT bit
343f0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
34400 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
34410 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
34420 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
34430 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
34440 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
34450 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
34460 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
34470 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
34480 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
34490 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
344a0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
344b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
344c0 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
344d0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
344e0 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
344f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34500 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
34510 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
34520 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
34530 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
34540 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
34550 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
34560 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
34570 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
34580 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
34590 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
345a0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
345b0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
345c0 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
345d0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
345e0 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
345f0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
34600 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
34610 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41  nal..**.** If PA
34620 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
34630 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  T is true, then 
34640 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
34650 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
34660 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
34670 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
34680 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
34690 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
346a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
346b0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
346c0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
346d0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
346e0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
346f0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
34700 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
34710 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
34720 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
34730 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
34740 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
34750 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
34760 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
34770 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
34780 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
34790 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
347a0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
347b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
347c0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
347d0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
347e0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
347f0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
34800 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
34810 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
34820 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
34830 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
34840 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
34850 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
34860 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
34870 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
34880 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
34890 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
348a0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
348b0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
348c0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
348d0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
348e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
348f0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
34900 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34910 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
34920 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
34930 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
34940 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
34950 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
34960 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
34970 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
34980 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
34990 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
349a0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
349b0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
349c0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
349d0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
349e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
349f0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
34a00 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
34a10 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
34a20 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
34a30 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
34a40 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
34a50 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
34a60 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67  ageNormal(.  Pag
34a70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
34a80 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
34a90 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34aa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
34ab0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
34ac0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
34ad0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
34ae0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
34af0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
34b00 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
34b10 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
34b20 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
34b30 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
34b40 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
34b50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34b60 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
34b70 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20    u8 noContent; 
34b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47    /* True if PAG
34ba0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34bb0 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c   is set */.  sql
34bc0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34bd0 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65   *pBase;..  asse
34be0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
34bf0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
34c00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34c10 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34c20 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
34c30 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34c40 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34c60 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
34c70 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
34c80 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
34c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34ca0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61  RUPT_BKPT;.  pBa
34cb0 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
34cc0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34cd0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
34ce0 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d  );.  if( pBase==
34cf0 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  0 ){.    pPg = 0
34d00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34d10 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72  e3PcacheFetchStr
34d20 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ess(pPager->pPCa
34d30 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73  che, pgno, &pBas
34d40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
34d50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34d60 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34d70 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73  rr;.    if( pBas
34d80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
34d90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34da0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34db0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34dc0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rr;.    }.  }.  
34dd0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34de0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34df0 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34e00 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34e10 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74  pBase);.  assert
34e20 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
34e30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34e40 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
34e50 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34e60 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34e70 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
34e80 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74   );..  noContent
34e90 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
34ea0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
34eb0 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  !=0;.  if( pPg->
34ec0 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
34ed0 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
34ee0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
34ef0 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
34f00 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
34f10 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
34f20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
34f30 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
34f40 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
34f50 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
34f60 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
34f70 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
34f80 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34f90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
34fa0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34fb0 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
34fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
34fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
34fe0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
34ff0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
35000 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
35010 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
35020 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
35030 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f  ed. But first so
35040 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a  me error checks:
35050 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
35060 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  1) The maximum p
35070 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
35080 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65  31.    ** (2) Ne
35090 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68  ver try to fetch
350a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
350b0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
350c0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
350d0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
350e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
350f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
35100 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35110 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35120 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35130 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
35140 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
35150 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  ager;..    asser
35160 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
35170 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42  r->fd) || !MEMDB
35180 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
35190 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
351a0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
351b0 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
351c0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
351d0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
351e0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
351f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
35200 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
35210 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35230 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
35240 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
35250 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
35260 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
35270 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
35280 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
35290 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
352a0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
352b0 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
352c0 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
352d0 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
352e0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
352f0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
35300 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
35310 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
35320 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
35330 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
35340 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
35350 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
35360 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
35370 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
35380 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
35390 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
353a0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
353b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
353c0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
353d0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
353e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
353f0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
35400 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
35410 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
35420 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
35430 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
35440 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
35450 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
35460 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
35470 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
35480 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
35490 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
354a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
354b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
354c0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
354d0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
354e0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
354f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
35500 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
35510 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
35520 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
35530 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
35540 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
35550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
35560 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35570 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
35580 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
35590 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
355a0 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
355b0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
355c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
355d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
355e0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
355f0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
35610 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
35620 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
35630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
35640 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35650 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
35660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
35670 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
35680 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
35690 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
356a0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
356b0 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50  (pPager);.  *ppP
356c0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
356d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
356e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
356f0 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20  E>0./* The page 
35700 67 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20  getter for when 
35710 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
35720 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  O is enabled */.
35730 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
35740 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20  geMMap(.  Pager 
35750 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
35760 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
35770 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35780 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
35790 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
357a0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
357b0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
357c0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
357d0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
357e0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
357f0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
35800 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
35810 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
35820 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  gs */.){.  int r
35830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35840 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
35850 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
35860 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
35870 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72     /* Frame to r
35880 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c  ead from WAL fil
35890 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
358a0 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
358b0 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
358c0 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
358d0 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
358e0 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
358f0 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
35900 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
35910 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
35920 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
35930 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
35940 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
35950 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
35960 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
35970 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
35980 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
35990 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
359a0 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
359b0 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70  (pgno>1.   && (p
359c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
359d0 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
359e0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
359f0 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29  T_READONLY)).  )
35a00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45  ;..  assert( USE
35a10 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b  FETCH(pPager) );
35a20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
35a30 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72  AS_CODEC.  asser
35a40 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  t( pPager->xCode
35a50 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  c==0 );.#endif..
35a60 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
35a70 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
35a80 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
35a90 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
35aa0 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
35ab0 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
35ac0 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
35ad0 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
35ae0 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
35af0 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
35b00 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
35b10 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
35b20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
35b30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
35b40 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
35b50 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
35b60 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
35b70 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
35b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
35b90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
35ba0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35bb0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35bc0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
35bd0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35be0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35c00 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35c10 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  dLock==1 );.  as
35c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
35c30 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
35c40 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70   );..  if( bMmap
35c50 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
35c60 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
35c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
35c80 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
35c90 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
35ca0 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
35cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35cc0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
35cd0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
35ce0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
35cf0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
35d00 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
35d10 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30   void *pData = 0
35d20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
35d30 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72  e3OsFetch(pPager
35d40 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28  ->fd, .        (
35d50 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
35d60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
35d70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35d80 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b  e, &pData.    );
35d90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35da0 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
35db0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
35dc0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
35dd0 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67  R_READER || pPag
35de0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
35df0 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
35e00 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
35e10 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
35e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35e30 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
35e40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
35e50 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
35e60 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
35e70 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  , &pPg);.      }
35e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
35e90 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
35ea0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
35eb0 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  (pgno-1)*pPager-
35ec0 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
35ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35ee0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
35ef0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
35f00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
35f10 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
35f20 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  Pg;.        retu
35f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35f40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35f60 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  K ){.      *ppPa
35f70 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
35f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
35f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50   }.  return getP
35fa0 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72  ageNormal(pPager
35fb0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
35fc0 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  flags);.}.#endif
35fd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
35fe0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
35ff0 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
36000 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65  r method for whe
36010 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  n the pager is a
36020 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  n error state */
36030 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
36040 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65  ageError(.  Page
36050 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
36060 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
36070 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
36080 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
36090 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
360a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
360b0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
360c0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
360d0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
360e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
360f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
36100 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
36110 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
36120 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  lags */.){.  UNU
36130 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67  SED_PARAMETER(pg
36140 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  no);.  UNUSED_PA
36150 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
36160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36170 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
36180 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67  E_OK );.  *ppPag
36190 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
361a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
361b0 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68  .}.../* Dispatch
361c0 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20   all page fetch 
361d0 72 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20  requests to the 
361e0 61 70 70 72 6f 70 72 69 61 74 65 20 67 65 74 74  appropriate gett
361f0 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e  er method..*/.in
36200 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
36210 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  t(.  Pager *pPag
36220 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
36230 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
36240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36250 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
36260 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
36270 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
36280 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
36290 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
362a0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
362b0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
362c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
362d0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
362e0 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
362f0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  .){.  return pPa
36300 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72  ger->xGet(pPager
36310 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
36320 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  flags);.}../*.**
36330 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
36340 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
36350 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
36360 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
36370 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
36380 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
36390 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
363a0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
363b0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
363c0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
363d0 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
363e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
363f0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
36400 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
36410 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
36420 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36430 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
36440 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
36450 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
36460 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
36470 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
36480 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
36490 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
364a0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
364b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
364c0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
364d0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
364e0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
364f0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
36500 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
36510 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
36520 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
36530 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  ){.  sqlite3_pca
36540 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b  che_page *pPage;
36550 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36560 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
36570 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
36580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36590 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70  PCache!=0 );.  p
365a0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
365b0 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
365c0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
365d0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
365e0 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
365f0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
36600 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50  Lock );.  if( pP
36610 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
36620 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  0;.  return sqli
36630 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
36640 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
36650 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67  ache, pgno, pPag
36660 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  e);.}../*.** Rel
36670 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
36680 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rence..**.** The
36690 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
366a0 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ef() and sqlite3
366b0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
366c0 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a  l() may only be.
366d0 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e  ** used if we kn
366e0 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ow that the page
366f0 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20   being released 
36700 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
36710 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72  page..** The btr
36720 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20  ee layer always 
36730 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e  holds page1 open
36740 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20   until the end, 
36750 73 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a  so these first.*
36760 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61  * to routines ca
36770 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c  n be used to rel
36780 65 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74  ease any page ot
36790 68 65 72 20 74 68 61 6e 20 42 74 53 68 61 72 65  her than BtShare
367a0 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20  d.pPage1..**.** 
367b0 55 73 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  Use sqlite3Pager
367c0 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74  UnrefPageOne() t
367d0 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e  o release page1.
367e0 20 20 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f    This latter ro
367f0 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20  utine.** checks 
36800 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
36810 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
36820 70 61 67 65 73 20 61 6e 64 20 69 66 20 74 68 65  pages and if the
36830 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
36840 67 65 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ges reaches zero
36850 20 69 74 20 64 72 6f 70 73 20 74 68 65 20 64 61   it drops the da
36860 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  tabase lock..*/.
36870 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
36880 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
36890 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45  Page *pPg){.  TE
368a0 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70  STONLY( Pager *p
368b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
368c0 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28  ger; ).  assert(
368d0 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28   pPg!=0 );.  if(
368e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
368f0 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
36900 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
36910 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65  o!=1 );  /* Page
36920 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72  1 is never memor
36930 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20  y mapped */.    
36940 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
36950 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
36960 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  e{.    sqlite3Pc
36970 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
36980 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ;.  }.  /* Do no
36990 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  t use this routi
369a0 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ne to release th
369b0 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65  e last reference
369c0 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61   to page1 */.  a
369d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
369e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
369f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
36a00 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
36a10 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
36a20 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
36a30 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
36a40 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
36a50 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Pg);.}.void sqli
36a60 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
36a70 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67  eOne(DbPage *pPg
36a80 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
36a90 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
36aa0 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g!=0 );.  assert
36ab0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  ( pPg->pgno==1 )
36ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
36ad0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
36ae0 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50  MMAP)==0 ); /* P
36af0 61 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65  age1 is never me
36b00 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
36b10 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
36b20 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
36b30 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
36b40 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  g);.  pagerUnloc
36b50 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
36b60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
36b70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
36b80 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
36b90 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
36ba0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
36bb0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
36bc0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
36bd0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
36be0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36bf0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
36c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
36c10 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
36c20 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
36c30 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
36c40 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
36c50 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
36c60 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
36c70 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
36c80 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
36c90 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
36ca0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
36cb0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
36cc0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
36cd0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
36ce0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
36cf0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
36d00 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
36d10 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
36d20 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
36d30 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
36d40 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
36d50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
36d60 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
36d70 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
36d80 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
36d90 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
36da0 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
36db0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
36dc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
36dd0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
36de0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
36df0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
36e00 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
36e10 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
36e20 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
36e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
36e40 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
36e50 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
36e60 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36e70 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
36e80 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
36e90 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
36ea0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
36eb0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
36ec0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
36ed0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
36ee0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
36ef0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
36f00 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
36f10 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
36f20 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
36f30 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
36f40 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
36f50 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
36f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
36f70 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
36f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
36f90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36fa0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36fc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
36fd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
36fe0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
36ff0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
37000 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
37010 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
37020 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37030 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37040 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
37050 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37060 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37070 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
37080 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37090 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
370a0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
370b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
370c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
370d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
370e0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
370f0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
37100 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
37110 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
37120 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
37130 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
37140 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
37150 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
37160 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
37170 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
37180 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
37190 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
371a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
371b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
371c0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
371d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
371e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
371f0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
37200 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
37210 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
37220 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
37230 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
37240 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  BKPT;.    }.  . 
37250 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
37260 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
37270 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
37280 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
37290 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
372a0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
372b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
372c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
372d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
372e0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
372f0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
37300 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
37310 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37320 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
37330 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
37340 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
37350 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
37360 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a      int nSpill;.
37370 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
37380 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
37390 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
373a0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
373b0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
373c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
373d0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
373e0 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c      nSpill = sql
373f0 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
37400 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Spill;.        }
37410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37420 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
37430 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
37440 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  L;.          nSp
37450 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72  ill = jrnlBuffer
37460 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
37470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37480 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65    .        /* Ve
37490 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
374a0 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
374b0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
374c0 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
374d0 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
374e0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
374f0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
37500 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
37510 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
37520 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37550 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20  3JournalOpen (. 
37560 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
37570 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
37580 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
37590 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a  , flags, nSpill.
375a0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
375b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
375c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
375d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
375e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
375f0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
37600 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
37610 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
37620 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
37630 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
37640 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
37650 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
37660 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
37670 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37690 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
376a0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
376b0 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
376c0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
376d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
376e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
376f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
37700 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
37710 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
37720 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37730 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
37740 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
37750 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
37760 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
37770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37780 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
37790 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
377a0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
377b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
377c0 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
377d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
377e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
377f0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37800 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
37810 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
37820 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
37830 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
37840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
37850 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
37860 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
37870 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
37880 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
37890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
378a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
378b0 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
378c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
378d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
378e0 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
378f0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
37900 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
37910 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
37920 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37930 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
37940 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
37950 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
37960 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
37970 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
37980 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
37990 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
379a0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
379b0 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
379c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
379d0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
379e0 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
379f0 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
37a00 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
37a10 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
37a20 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
37a30 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
37a40 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
37a50 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
37a60 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
37a70 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
37a80 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
37a90 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
37aa0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
37ab0 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
37ac0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
37ad0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
37ae0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
37af0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
37b00 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
37b10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
37b20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
37b30 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
37b40 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
37b50 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
37b60 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
37b70 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
37b80 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
37b90 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
37ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37bb0 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
37bc0 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
37bd0 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
37be0 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
37bf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
37c00 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
37c10 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
37c20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
37c30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37c40 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
37c50 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
37c60 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
37c70 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
37c80 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
37c90 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
37ca0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
37cb0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37cc0 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
37cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37ce0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
37cf0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
37d00 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37d10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
37d20 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
37d30 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
37d40 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
37d50 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
37d60 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
37d70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
37d80 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
37d90 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
37da0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
37db0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
37dc0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
37dd0 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
37de0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
37df0 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
37e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
37e10 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
37e20 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
37e30 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
37e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37e50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37e60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
37e70 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
37e80 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
37e90 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
37ea0 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
37eb0 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
37ec0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
37ed0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
37ee0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
37ef0 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
37f00 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
37f10 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
37f20 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
37f30 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
37f40 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
37f50 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
37f60 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
37f70 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
37f80 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
37f90 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
37fa0 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
37fb0 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
37fc0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
37fd0 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
37fe0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
37ff0 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
38000 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
38010 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
38020 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
38030 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
38040 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
38050 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
38060 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
38070 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
38080 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
38090 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
380a0 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
380b0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
380c0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
380d0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
380e0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
380f0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
38100 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
38110 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
38120 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
38130 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
38140 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
38150 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
38160 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
38170 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
38180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38190 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
381a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
381b0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
381c0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
381d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
381e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
381f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38200 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
38210 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
38220 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
38230 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
38240 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
38250 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
38260 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
38270 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
38280 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
38290 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
382a0 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
382b0 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
382c0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
382d0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
382e0 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
382f0 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
38300 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
38310 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
38320 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
38330 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
38340 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
38350 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
38360 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
38370 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
38380 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
38390 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
383a0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
383b0 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
383c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
383d0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
383e0 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
383f0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
38400 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
38410 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
38420 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
38430 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
38440 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
38450 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
38460 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
38470 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
38480 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
38490 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
384a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
384b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
384c0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
384d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
384e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
384f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
38500 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
38510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
38520 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
38530 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a  (pPager) );.  }.
38540 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
38550 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
38560 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
38570 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r)));.  return r
38580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
38590 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20  e page pPg onto 
385a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
385b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
385c0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
385d0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70  E_NOINLINE int p
385e0 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c  agerAddPageToRol
385f0 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48  lbackJournal(PgH
38600 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
38610 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
38620 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
38630 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  c;.  u32 cksum;.
38640 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
38650 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
38660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
38670 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64  ..  /* We should
38680 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
38690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
386a0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
386b0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
386c0 20 64 61 74 61 62