/ Hex Artifact Content
Login

Artifact bdbcfe676cda9295572e4ce95a3fae827082f9f0:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70  */..  void *pMap
7c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c80: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
7c90: 65 64 20 70 72 65 66 69 78 20 6f 66 20 64 61 74  ed prefix of dat
7ca0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7cb0: 69 36 34 20 6e 4d 61 70 3b 20 20 20 20 20 20 20  i64 nMap;       
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cd0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
7ce0: 74 20 70 4d 61 70 20 69 6e 20 62 79 74 65 73 20  t pMap in bytes 
7cf0: 2a 2f 20 0a 20 20 69 36 34 20 6e 4d 61 70 56 61  */ .  i64 nMapVa
7d00: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
7d10: 20 20 2f 2a 20 42 79 74 65 73 20 61 74 20 70 4d    /* Bytes at pM
7d20: 61 70 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  ap known to be v
7d30: 61 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  alid */.  int nM
7d40: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7d70: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7d80: 69 6e 67 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ing */.  PgHdr *
7d90: 70 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  pFree;          
7da0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7db0: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
7dc0: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
7dd0: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7de0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7df0: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7e00: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7e60: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7e70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7e80: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7e90: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7ea0: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7eb0: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7ec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7ed0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7ee0: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7ef0: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7f00: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7f10: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7f20: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7f30: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7f40: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7f50: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7f60: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7f70: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7f80: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7fa0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7fb0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7fc0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7fe0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7ff0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
8000: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
8010: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
8020: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
8030: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
8040: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
8050: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8060: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8070: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8090: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
80a0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
80b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
80c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
80d0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
80e0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
80f0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8100: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
8110: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
8120: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
8130: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
8140: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
8150: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8160: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8170: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8180: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8190: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
81a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
81b0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
81e0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
81f0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8200: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
8210: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
8220: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8230: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8240: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8250: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8260: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8270: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8280: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8290: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
82a0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
82b0: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
82c0: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
82d0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
82e0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
82f0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8300: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8310: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
8320: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8330: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8350: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8360: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8370: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8380: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
83a0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
83b0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
83c0: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
83d0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
83f0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8400: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8420: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8430: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8440: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8450: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8460: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8470: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8480: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8490: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
84a0: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
84b0: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
84c0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
84d0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
84e0: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
84f0: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8500: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
8510: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
8520: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
8530: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8540: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
8550: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
8560: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8570: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8580: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8590: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
85a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
85b0: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
85c0: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
85d0: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
85e0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
85f0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8600: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
8610: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
8620: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
8630: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
8640: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
8650: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
8660: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8670: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8680: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8690: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
86a0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
86b0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
86c0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
86d0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
86e0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
86f0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8700: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
8710: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
8720: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
8730: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
8740: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8750: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
8760: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8770: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8780: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8790: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
87a0: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
87b0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
87c0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
87d0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
87e0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
87f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8800: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
8810: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
8820: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
8830: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
8840: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
8850: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
8860: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8870: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8880: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8890: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
88a0: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
88b0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
88c0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
88d0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
88e0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
88f0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8900: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
8910: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
8920: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
8930: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
8940: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
8950: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
8960: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8970: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8980: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8990: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
89a0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
89b0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
89c0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
89d0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
89e0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
89f0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8a00: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
8a10: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
8a20: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
8a30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
8a40: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
8a50: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
8a60: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8a70: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8a80: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8a90: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8aa0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8ab0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8ac0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8ad0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8ae0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8af0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8b00: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
8b10: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
8b20: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
8b30: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
8b40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
8b50: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
8b60: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8b70: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8b80: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8b90: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8ba0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8bb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8bc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8bd0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8be0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8bf0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8c00: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8c10: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8c20: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8c30: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8c40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8c50: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8c60: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8c70: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8c80: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8c90: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8ca0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8cb0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8cc0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8cd0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8ce0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8cf0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8d00: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8d10: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8d20: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8d30: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8d40: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8d50: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8d60: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8d70: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8d80: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8d90: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8da0: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8db0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8dc0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8dd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8de0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8df0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8e00: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8e10: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8e20: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8e30: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8e40: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8e50: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8e60: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8e70: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8e80: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8e90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8ea0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8eb0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8ec0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8ed0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8ee0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8ef0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8f00: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8f10: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8f20: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8f30: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8f40: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8f50: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8f60: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8f70: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8f80: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8f90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8fa0: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8fc0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8fd0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8fe0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8ff0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
9000: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9010: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9020: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9030: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9040: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
9050: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
9060: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
9070: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
9080: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
9090: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
90a0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
90b0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
90c0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
90d0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
90e0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
90f0: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9100: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9110: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9120: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9130: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9140: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
9150: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
9160: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9170: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9180: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9190: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
91a0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
91b0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
91c0: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
91d0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
91e0: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
91f0: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9200: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
9210: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
9220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
9230: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
9240: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
9250: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
9260: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9270: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9280: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9290: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
92a0: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
92b0: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
92c0: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
92d0: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
92e0: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
92f0: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9300: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
9310: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
9320: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
9330: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
9340: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
9350: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
9360: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9370: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9380: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
93a0: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
93b0: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
93c0: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
93d0: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
93e0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
93f0: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9400: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
9410: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
9420: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
9430: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
9440: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
9450: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
9460: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9470: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9480: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9490: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
94a0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
94b0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
94c0: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
94d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
94e0: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
94f0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9500: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9510: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
9520: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9530: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
9540: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
9550: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
9560: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9570: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9580: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9590: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
95a0: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
95b0: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
95c0: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
95d0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
95e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
95f0: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9600: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
9610: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
9620: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
9630: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
9640: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
9650: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9660: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9670: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9680: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9690: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
96a0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
96b0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
96c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
96d0: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
96e0: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
96f0: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9700: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9710: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9720: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9740: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9750: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9760: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9770: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9780: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9790: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
97a0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
97b0: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
97c0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
97d0: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
97e0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
97f0: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9800: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9810: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9820: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9830: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9840: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9850: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9860: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9870: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9880: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9890: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
98a0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
98b0: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
98c0: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
98d0: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
98e0: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
98f0: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9900: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9910: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9920: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9930: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9940: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9950: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9960: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9970: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9980: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9990: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
99a0: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
99b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
99c0: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
99d0: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
99e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
99f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9a00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9a10: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9a20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9a30: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9a40: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
9a60: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9a70: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9a80: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9a90: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9aa0: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9ab0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9ac0: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9ad0: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9ae0: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9af0: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9b00: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
9b10: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9b20: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9b30: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
9b40: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
9b50: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
9b60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9b70: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9b80: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9b90: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9ba0: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9bb0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9bc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9bd0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9be0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9bf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9c00: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9c10: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9c20: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9c30: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9c40: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9c50: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9c60: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9c70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9c80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9ca0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9cb0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9cc0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9cd0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9cf0: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9d00: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9d10: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9d20: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9d30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9d40: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9d60: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9d70: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9d80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d90: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9da0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9db0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9dc0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9dd0: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9de0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9df0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e00: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9e10: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e30: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9e40: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9e50: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9e60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9e70: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9e80: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9e90: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9ea0: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9eb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ec0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9ed0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ee0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9ef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9f00: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9f10: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9f20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9f30: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9f40: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9f50: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9f60: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9f70: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9f80: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9f90: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9fa0: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9fb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9fc0: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9fd0: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9fe0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9ff0: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
a000: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
a010: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
a020: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
a040: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
a050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a060: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a070: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a080: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a090: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a0a0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
a0b0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a0c0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a0d0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a0e0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a100: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a110: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
a120: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a130: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a140: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a150: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a160: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a170: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a180: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a190: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a1a0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a1b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a1c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a1d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a1e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a1f0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a200: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a210: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a220: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a230: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a240: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a250: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a270: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a280: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a290: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2b0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a2d0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a2e0: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a2f0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a300: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a310: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a320: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a330: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a340: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a360: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a370: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a380: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a390: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a3a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a3b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a400: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a410: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a420: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a430: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a440: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a450: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a460: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a470: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a480: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a490: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a4a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a4b0: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a4c0: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a4d0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a4e0: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a4f0: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a500: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a510: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a520: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a530: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a540: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a550: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a560: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a570: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a580: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a590: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a5a0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a5b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a5c0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a5d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a5e0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a5f0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a600: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a610: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a630: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a640: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a650: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a660: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a670: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a680: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a690: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a6a0: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a6b0: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a6c0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a6d0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a6e0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a6f0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a700: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a710: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a720: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a730: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a740: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a750: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a760: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a770: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a780: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a790: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a7a0: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a7b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a7c0: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a7d0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a7e0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a7f0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a800: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a810: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a820: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a830: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a840: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a850: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a860: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a870: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a880: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a890: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a8a0: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a8b0: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a8c0: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a8d0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a8e0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a8f0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a900: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a910: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a920: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a930: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a940: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a950: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a960: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a970: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a980: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a990: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a9a0: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a9b0: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a9c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9d0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a9e0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a9f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa00: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa10: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
aa20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
aa30: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aa40: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
aa50: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
aa60: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
aa70: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
aa80: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
aa90: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
aaa0: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
aab0: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
aac0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
aad0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
aae0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
aaf0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
ab00: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
ab10: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
ab20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
ab30: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
ab40: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
ab50: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
ab60: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
ab70: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
ab80: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
ab90: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aba0: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
abb0: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
abc0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
abd0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abe0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
abf0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
ac00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac20: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
ac30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ac40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ac50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
ac60: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ac70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ac80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ac90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
aca0: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
acb0: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
acc0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
acd0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ace0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
acf0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ad00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ad10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ad20: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
ad30: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
ad40: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
ad50: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
ad60: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ad70: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ad80: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ad90: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ada0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
adb0: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
adc0: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
add0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ade0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
adf0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ae00: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
ae10: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
ae20: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
ae30: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
ae40: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ae50: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
ae60: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ae70: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ae80: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ae90: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
aea0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
aeb0: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
aec0: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
aed0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
aee0: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
aef0: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
af00: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
af10: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
af20: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
af30: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
af40: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
af50: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
af60: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
af70: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
af80: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
af90: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
afa0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
afb0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
afc0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
afd0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
afe0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
aff0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
b000: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b010: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b020: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b030: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b040: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b050: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
b060: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
b070: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b080: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b0a0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b0b0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
b0c0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
b0d0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
b0e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
b0f0: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
b100: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b110: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b120: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
b130: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
b140: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
b150: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
b160: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b170: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b180: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b190: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b1a0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b1b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b1c0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b1d0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b1e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b1f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b200: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b210: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b220: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b230: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b240: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b250: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b260: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b270: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b280: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b290: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b2a0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b2b0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b2c0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b2d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b2e0: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b2f0: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b320: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b330: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b340: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b350: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b360: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b370: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b380: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b390: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b3a0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b3b0: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b3c0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b3d0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b3e0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b3f0: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b400: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b410: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b420: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b430: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b440: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b450: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b460: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b470: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b480: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b490: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b4a0: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b4c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b4d0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b4e0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b4f0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b500: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b510: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b520: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b530: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b540: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b550: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b560: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b570: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b580: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b590: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b5a0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b5b0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b5c0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b5d0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b5e0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b5f0: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b600: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b610: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b620: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b630: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b640: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b650: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b660: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b670: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b680: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b690: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b6a0: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b6b0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b6c0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b6d0: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b6e0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b6f0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b700: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b710: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b720: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b730: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b740: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b750: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b760: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b770: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b790: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b7a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b7b0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b7c0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b7d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b7e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b800: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b810: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b820: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b830: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b840: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b850: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b860: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b870: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b880: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b890: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b8a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b8b0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b8c0: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b8d0: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b8e0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b8f0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b900: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b910: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b920: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b930: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b940: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b950: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b960: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b970: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b980: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b990: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b9a0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b9b0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b9c0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b9d0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b9e0: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b9f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
ba00: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
ba10: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ba20: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
ba30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
ba40: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
ba50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
ba60: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ba70: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
ba80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
ba90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
baa0: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
bab0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
bac0: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
bad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
bae0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
baf0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
bb00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
bb10: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
bb20: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
bb30: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
bb40: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
bb50: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
bb60: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
bb70: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
bb80: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bb90: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
bba0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bbb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bbc0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
bbd0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
bbe0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
bbf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
bc00: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
bc10: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bc20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bc30: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bc40: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bc50: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
bc60: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bc70: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bc80: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bc90: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bca0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bcb0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bcc0: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bcd0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bce0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bcf0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bd00: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bd10: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bd20: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bd30: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bd40: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bd50: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bd60: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bd70: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bd80: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bd90: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bda0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bdb0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bdc0: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bdd0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bde0: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bdf0: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
be00: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
be10: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
be20: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
be30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
be40: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
be50: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
be60: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
be70: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
be80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
be90: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bea0: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
beb0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bec0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bed0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bee0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bef0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bf00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bf20: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bf30: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bf40: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf60: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
bf70: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
bfa0: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
bfb0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
bfc0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
bfd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
bfe0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
bff0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
c000: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
c010: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
c020: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
c030: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
c040: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c050: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
c060: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
c070: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c080: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
c090: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
c0a0: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
c0b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c0c0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
c0d0: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
c0e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
c0f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
c100: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
c110: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c120: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
c130: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
c140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
c150: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c160: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c170: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c180: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c190: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c1a0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c1b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c1c0: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c1d0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c1e0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c1f0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c200: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c210: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c220: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c230: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c240: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c250: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c270: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c280: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c290: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c2a0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c2b0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c2c0: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c2d0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c2e0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c2f0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c300: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c310: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c320: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c330: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c340: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c350: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c360: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c370: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c380: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c390: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c3a0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c3b0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c3c0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c3d0: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c3e0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c3f0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c400: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c410: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c420: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c430: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c440: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c450: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c460: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c470: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c480: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c490: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c4a0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c4b0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c4c0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c4d0: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c4e0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c4f0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c500: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c510: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c520: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c530: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c540: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c550: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c560: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c570: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c580: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c590: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c5a0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c5b0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c5c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c5d0: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c5e0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c5f0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c600: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c620: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c630: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c640: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c650: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c670: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c680: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c690: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c6a0: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c6b0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c6c0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c6d0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c6e0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c6f0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c700: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c710: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c720: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c730: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c740: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c760: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c770: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c780: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c790: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c7a0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c7b0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c7c0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c7d0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c7e0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c7f0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c800: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c810: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c820: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c830: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c840: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c860: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c870: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c880: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c890: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c8a0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c8b0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c8c0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c8d0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c8e0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c8f0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c900: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c910: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c920: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c930: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c950: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c960: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c970: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c980: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c990: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c9a0: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c9b0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c9c0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c9d0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c9e0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c9f0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
ca00: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
ca10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ca20: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
ca30: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
ca40: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
ca50: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
ca60: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
ca70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ca80: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
ca90: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
caa0: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
cab0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
cac0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
cad0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
cae0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
caf0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
cb00: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
cb10: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
cb20: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
cb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cb40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
cb50: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
cb70: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
cb80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb90: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
cbc0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
cbd0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
cbe0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
cc10: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cc20: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cc30: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cc40: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cc50: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
cc60: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cc70: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cc80: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cc90: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cca0: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
ccb0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
ccc0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ccd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cce0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
ccf0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cd00: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cd10: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cd20: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cd30: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cd40: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cd50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cd60: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cd70: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cd80: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cd90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cda0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cdb0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cdc0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cdd0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cde0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cdf0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ce00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ce10: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ce20: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ce30: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ce40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
ce50: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ce60: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
ce70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce80: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
ce90: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cea0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
ceb0: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cec0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
ced0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cee0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cef0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cf00: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cf10: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cf20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cf30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cf40: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cf50: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cf60: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
cf70: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
cf80: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
cf90: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
cfa0: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
cfb0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
cfc0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
cfd0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
cfe0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
cff0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d020: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d030: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
d040: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
d050: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
d060: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
d070: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d080: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
d090: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
d0a0: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
d0b0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d0c0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
d0d0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
d0e0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
d0f0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
d100: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
d110: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
d140: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
d150: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
d160: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d170: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d180: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d1a0: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d1d0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d1e0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d1f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d200: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d210: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d220: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d230: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d240: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d250: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d260: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d270: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d280: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d290: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d2a0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d2b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d2c0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d2d0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d2e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d2f0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d300: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d310: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d320: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d330: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d340: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d360: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d380: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d390: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d3a0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d3b0: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d3c0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d3d0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d3e0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d3f0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d400: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d410: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d420: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d430: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d440: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d450: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d460: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d470: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d480: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d490: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d4a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d4b0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d4c0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d4d0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d4e0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d4f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d500: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d510: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d520: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d530: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d540: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d550: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d560: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d570: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d580: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d590: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d5a0: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d5b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d5c0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d5d0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d5e0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d5f0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d600: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d610: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d620: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d630: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d640: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d650: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d660: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d670: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d680: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d690: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d6a0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d6b0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d6c0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d6d0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d6f0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d700: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d710: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d720: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d730: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d760: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d770: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d780: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d790: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d7a0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d7b0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d7c0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d7d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d7e0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d7f0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d800: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d810: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d820: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d830: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d840: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d850: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d860: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d870: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d880: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d890: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d8a0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d8c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d8d0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d8e0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d8f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d900: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d910: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d920: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d930: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d940: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d950: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d960: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d980: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d990: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d9a0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d9b0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d9c0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d9d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d9e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d9f0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
da00: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
da10: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
da20: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
da30: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
da40: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
da50: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
da60: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
da70: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
da80: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
da90: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
daa0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
dab0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
dac0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
dad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
dae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
daf0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
db00: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
db10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
db20: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
db30: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
db40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
db50: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
db60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
db70: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
db80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
db90: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
dba0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dbb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
dbc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
dbd0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
dbe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dbf0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
dc00: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
dc10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dc20: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dc30: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dc40: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dc50: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
dc60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
dc70: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
dc80: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
dc90: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
dca0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
dcb0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
dcc0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
dcd0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
dce0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
dcf0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
dd00: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dd10: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dd20: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dd30: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dd40: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dd50: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dd60: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dd70: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dd80: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dd90: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dda0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
ddb0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
ddc0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
ddd0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dde0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
ddf0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
de00: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
de10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de20: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
de30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
de40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
de50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
de60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
de70: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
de80: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
de90: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dea0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
deb0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dec0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
ded0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
def0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
df00: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
df10: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
df20: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
df50: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
df60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
df90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dfa0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dfb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
dfc0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
dfd0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
dfe0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
dff0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e000: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e010: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e030: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e040: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e050: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e060: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e070: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e080: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e090: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e0a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e0b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e0c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e0d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e0e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e0f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e100: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e110: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e120: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e130: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e140: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e150: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e160: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e170: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e180: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e190: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e1a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e1b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e1c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e1d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e1e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e1f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e200: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e210: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e220: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e230: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e240: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e250: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e260: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e270: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e280: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e290: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e2a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e2b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e2c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e2d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e2e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e2f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e300: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e310: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e320: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e330: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e340: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e350: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e360: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e370: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e380: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e390: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e3a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e3b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e3c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e3d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e3e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e3f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e400: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e410: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e420: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e430: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e440: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e450: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e460: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e470: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e480: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e490: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e4a0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e4b0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e4c0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e4d0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e4e0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e4f0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e500: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e510: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e520: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e530: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e540: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e550: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e560: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e570: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e580: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e590: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e5a0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e5b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e5c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e5d0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e5e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e5f0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e600: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e610: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e620: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e630: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e640: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e650: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e660: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e670: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e680: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e690: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e6a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e6b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e6c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e6d0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e6e0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e6f0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e700: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e710: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e720: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e730: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e740: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e750: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e760: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e770: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e780: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e790: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e7a0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e7b0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e7c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e7d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e7e0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e7f0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e800: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e810: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e820: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e830: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e840: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e850: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e860: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e870: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e880: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e890: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e8a0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e8b0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e8c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e8d0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e8e0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e8f0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e900: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e910: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e920: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e940: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e950: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e960: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e970: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e980: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e990: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e9a0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e9b0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e9c0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e9d0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e9e0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e9f0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
ea00: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
ea10: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
ea20: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
ea30: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
ea40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ea50: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
ea60: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
ea70: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ea80: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
ea90: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
eaa0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
eab0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
eac0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
ead0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
eae0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
eaf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
eb00: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
eb10: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
eb20: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
eb30: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
eb40: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
eb50: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
eb60: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
eb70: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
eb80: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
eb90: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
eba0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ebb0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ebc0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ebd0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ebe0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ebf0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ec00: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
ec10: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
ec20: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
ec30: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ec40: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
ec50: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
ec60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
ec70: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
ec80: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
ec90: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eca0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
ecb0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
ecc0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
ecd0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
ece0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
ecf0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
ed00: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
ed10: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ed20: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ed30: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ed40: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ed50: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ed60: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ed70: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ed80: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ed90: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
eda0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
edb0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
edc0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
edd0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ede0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
edf0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ee00: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
ee10: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ee20: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ee30: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ee40: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ee50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ee60: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ee70: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ee80: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ee90: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
eea0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
eeb0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
eec0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eed0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
eee0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
eef0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ef00: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
ef10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ef20: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
ef30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ef40: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ef50: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
ef60: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ef70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ef80: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ef90: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
efa0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
efb0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
efc0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
efd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
efe0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
eff0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f000: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f010: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f020: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f030: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f040: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f050: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f060: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f070: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f080: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f090: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f0a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f0b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f0c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f0d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f0e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f0f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f100: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f110: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f120: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f130: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f140: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f150: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f160: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f170: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f180: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f190: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f1a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f1b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f1c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f1d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f1e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f1f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f200: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f210: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f220: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f230: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f240: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f250: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f260: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f270: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f280: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f290: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f2a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f2b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f2c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f2d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f2f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f300: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f330: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f340: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f360: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f370: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f380: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f390: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f3b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f3c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f3d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f3e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f3f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f400: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f410: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f420: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f450: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f460: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f470: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f480: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f490: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f4a0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4c0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f4d0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f4e0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f4f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f500: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f510: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f520: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f530: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f540: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f550: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f560: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f570: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f580: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f590: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f5a0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f5b0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f5c0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f5d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f5e0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f5f0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f600: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f610: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f630: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f640: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f650: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f670: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f680: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f690: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f6a0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f6b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f6c0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f6d0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f6e0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f6f0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f700: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f710: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f720: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f730: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f750: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f760: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f770: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f780: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f790: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f7a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f7b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f7c0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f7d0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f7e0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f7f0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f800: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f810: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f820: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f830: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f840: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f850: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f880: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f890: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f8a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f8b0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f8c0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f8d0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f8e0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f8f0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f900: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f910: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f920: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f930: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f940: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f950: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f960: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f970: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f980: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f990: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f9a0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f9b0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f9c0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f9d0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f9e0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f9f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fa00: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fa10: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fa20: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
fa30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
fa40: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
fa50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fa60: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
fa70: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
fa80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
fa90: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
faa0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fab0: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
fac0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
fad0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
fae0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
faf0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
fb00: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fb10: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
fb20: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
fb30: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
fb40: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
fb50: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fb60: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fb70: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fb80: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fb90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fba0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fbb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fbc0: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fbd0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fbe0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fc00: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
fc10: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fc20: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fc30: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fc40: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fc50: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
fc60: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fc70: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fc80: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fc90: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fca0: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fcb0: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fcc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fcd0: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fce0: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fcf0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fd00: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fd10: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fd20: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fd30: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fd40: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fd50: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fd60: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fd70: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fd80: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fd90: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fda0: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fdb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fdc0: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fdd0: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fde0: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fdf0: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fe00: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fe10: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fe20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fe30: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fe50: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fe60: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fe70: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fe80: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fe90: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fea0: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
feb0: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fec0: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fed0: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fee0: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
ff00: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
ff10: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
ff20: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
ff30: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
ff40: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
ff50: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
ff60: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
ff70: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
ff80: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
ff90: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
ffa0: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
ffb0: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
ffc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
ffd0: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
ffe0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fff0: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10000 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10010 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10030 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10040 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10050 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10060 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10070 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10080 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10090 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
100a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
100b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
100c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
100d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
100e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10100 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10110 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10120 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10130 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10140 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10150 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10160 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10170 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10180 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10190 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
101a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
101b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
101c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
101d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
101e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
101f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10200 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10210 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10220 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10230 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10240 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10250 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10260 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10270 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10280 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10290 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
102a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
102b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
102c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
102d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
102e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
102f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10300 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10310 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10320 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10330 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10340 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10350 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10360 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10380 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10390 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
103a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
103b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
103c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
103d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
103e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
103f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10400 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10410 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10420 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10430 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10440 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10450 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10460 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10470 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10480 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10490 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
104a0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
104b0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
104c0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
104d0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
104e0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
104f0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10500 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10510 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10520 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10530 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10540 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10550 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10560 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10570 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10580 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10590 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
105a0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
105b0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
105c0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
105d0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
105e0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
105f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10600 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10610 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10620 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10630 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10640 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10650 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10660 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10670 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10680 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10690 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
106c0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
106f0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10700 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10730 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10740 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10750 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10770 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10780 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10790 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
107a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
107b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
107c0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
107d0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
107e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
107f0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10800 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10810 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10820 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10840 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10850 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10860 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10870 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10880 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10890 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
108a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
108b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
108c0 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
108d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
108e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
108f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10900 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
10910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
10920 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
10930 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
10940 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
10950 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
10960 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10970 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10980 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10990 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
109a0 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
109b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
109c0 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
109d0 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
109e0 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
109f0 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10a00 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
10a10 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
10a20 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
10a30 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
10a40 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
10a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
10a60 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10a70 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10a80 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10a90 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10ab0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10ac0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10ad0 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10ae0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10af0 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10b00 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
10b10 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
10b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10b30 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
10b40 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10b50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
10b60 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10b70 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10b80 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10b90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10ba0 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10bb0 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10bc0 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10bd0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10be0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10bf0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10c00 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10c10 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10c20 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10c30 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10c40 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10c50 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10c60 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10c70 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10c80 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10c90 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10ca0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10cb0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10cd0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10ce0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10cf0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10d10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d20 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10d30 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10d40 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10d50 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10d60 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10d70 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10d80 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10d90 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10da0 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10db0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10dc0 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10dd0 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10de0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10df0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10e00 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10e10 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10e20 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10e30 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10e40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10e50 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10e60 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10e70 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10e80 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10e90 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10ea0 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10eb0 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10ec0 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10ed0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10ee0 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10ef0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10f00 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10f10 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10f20 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10f30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10f40 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10f50 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10f60 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10f70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10f80 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10f90 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10fa0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10fb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10fe0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10ff0 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
11000 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
11010 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
11020 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
11030 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
11040 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
11050 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
11060 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
11070 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
11080 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
11090 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
110a0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
110b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
110d0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
110e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
110f0 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
11100 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
11110 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
11120 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
11130 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
11140 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
11150 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
11160 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11170 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11180 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11190 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
111a0 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
111b0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
111c0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
111d0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
111e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
111f0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11200 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11210 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11220 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
11230 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
11240 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
11250 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
11260 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11270 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11280 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11290 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
112a0 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
112b0 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
112c0 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
112d0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
112e0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
112f0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11300 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11310 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11320 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11330 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11350 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11360 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11370 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11390 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
113a0 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
113b0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
113c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
113d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
113e0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
113f0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11400 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11410 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11420 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11430 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11440 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11450 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
11460 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11480 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11490 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
114a0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
114b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
114c0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
114d0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
114e0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
114f0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11500 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
11510 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11520 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11530 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11540 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11550 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11560 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11580 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11590 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
115a0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
115b0 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
115c0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
115d0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
115e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
115f0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11600 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11610 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11620 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11640 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11650 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11660 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11670 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11680 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11690 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
116a0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
116b0 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
116c0 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
116d0 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
116e0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
116f0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11700 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
11710 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11720 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11730 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11740 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11750 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11780 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11790 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
117a0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
117b0 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
117c0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
117d0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
117e0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
117f0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11800 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
11810 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11820 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11830 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11840 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11850 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11860 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11870 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11880 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11890 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
118a0 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
118b0 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
118c0 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
118d0 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
118e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
118f0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11910 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
11920 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11930 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11940 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11950 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11960 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11970 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11980 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11990 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
119a0 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
119b0 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
119c0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
119d0 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
119e0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
119f0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11a00 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
11a10 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
11a20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11a30 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11a40 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11a50 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11a60 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11a70 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11a80 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11a90 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11aa0 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11ab0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11ac0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11ad0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11ae0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11af0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11b00 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
11b10 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11b20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11b30 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11b40 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11b50 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11b60 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11b70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11b80 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11b90 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11ba0 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11bb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11bd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11be0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11bf0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11c00 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11c10 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11c20 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11c30 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11c40 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11c50 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11c60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c80 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11c90 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11ca0 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11cb0 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11cc0 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11cd0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11ce0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11cf0 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11d00 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11d10 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11d20 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11d30 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11d40 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11d60 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11d70 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11d80 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11d90 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11da0 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11db0 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11dc0 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11dd0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11de0 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11df0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11e00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11e10 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11e20 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11e30 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11e40 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11e50 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11e60 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11e70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11e80 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11e90 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11ea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11eb0 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11ec0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ed0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11ee0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11f00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11f10 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11f20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11f30 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11f40 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11f50 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11f60 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11f70 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11f90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11fa0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11fb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11fc0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11fd0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11fe0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11ff0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
12000 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
12010 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
12020 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
12030 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
12040 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
12050 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
12060 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
12070 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
12080 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
12090 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
120a0 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
120b0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
120c0 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
120d0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
120e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
120f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12100 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
12110 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
12120 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
12130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12140 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
12150 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
12160 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12170 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12180 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12190 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
121a0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
121b0 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
121c0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
121d0 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
121e0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
121f0 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12200 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
12210 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12220 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12230 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12240 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12250 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12260 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12270 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12280 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
122a0 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
122b0 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
122c0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
122d0 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
122e0 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
122f0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12300 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
12310 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12320 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12330 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12340 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12350 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
12360 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12370 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12380 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12390 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
123a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
123b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
123c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
123d0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
123e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
123f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12400 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12410 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
12420 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12430 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12440 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12450 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
12460 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12470 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12480 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12490 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
124a0 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
124b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
124c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
124d0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
124e0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
124f0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12500 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12510 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12520 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12530 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
12540 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
12550 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12560 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12570 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12580 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12590 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
125a0 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
125b0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
125c0 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
125d0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
125e0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
125f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12600 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12610 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12620 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12630 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
12640 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
12650 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
12660 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12670 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12680 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12690 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
126a0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
126b0 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
126c0 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
126d0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
126e0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
126f0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12700 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
12710 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
12720 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12730 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12740 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12750 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12760 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12770 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12780 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12790 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
127a0 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
127b0 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
127c0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
127d0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
127e0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
127f0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12800 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
12810 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
12820 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12830 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12840 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12850 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12860 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12870 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12880 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12890 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
128a0 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
128b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
128c0 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
128d0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
128e0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
128f0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12910 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
12920 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12930 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12940 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12950 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12960 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12970 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12980 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12990 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
129a0 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
129b0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
129c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
129d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
129e0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
129f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12a00 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
12a10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12a20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
12a30 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12a40 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12a50 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
12a60 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12a70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12a80 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12a90 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12aa0 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12ab0 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12ac0 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12ad0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12ae0 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12af0 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12b00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
12b10 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
12b20 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
12b30 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
12b40 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
12b50 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12b60 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12b70 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12b90 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12ba0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12bb0 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12bc0 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12bd0 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12be0 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12bf0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12c00 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12c10 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12c20 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12c30 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12c40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12c50 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12c60 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12c70 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12c80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12c90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12ca0 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12cb0 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12cc0 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12cd0 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12ce0 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12cf0 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
12d00 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
12d10 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
12d20 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
12d30 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
12d40 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
12d50 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
12d60 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
12d70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
12d80 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
12d90 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12da0 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
12db0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12dc0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12dd0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12de0 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
12df0 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
12e00 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
12e10 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
12e20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12e30 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12e40 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
12e50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
12e60 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
12e70 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
12e80 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
12e90 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
12ea0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
12eb0 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
12ec0 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
12ed0 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
12ee0 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
12ef0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
12f00 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12f10 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
12f20 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
12f30 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
12f40 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
12f50 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
12f60 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
12f70 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12f80 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
12f90 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
12fa0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
12fb0 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
12fc0 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
12fd0 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
12fe0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
12ff0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
13000 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
13010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13020 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13030 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
13040 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
13050 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
13060 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13070 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
13080 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
13090 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
130a0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
130b0 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
130c0 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
130d0 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
130e0 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
130f0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
13100 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13110 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
13120 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
13130 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
13140 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
13150 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
13160 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
13170 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
13180 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
13190 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
131a0 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
131b0 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
131c0 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
131d0 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
131e0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
131f0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13200 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
13210 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13220 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
13230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
13240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13250 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
13260 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
13270 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
13280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13290 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
132a0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
132b0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
132c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
132d0 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
132e0 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
132f0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
13310 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
13320 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
13330 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
13340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
13350 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
13360 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13370 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13380 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13390 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
133a0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
133b0 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
133c0 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
133d0 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
133e0 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
133f0 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13400 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13410 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
13420 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
13430 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
13440 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
13450 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
13460 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13470 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13480 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13490 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
134a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
134b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
134c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
134d0 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
134e0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
134f0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13500 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13510 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13520 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13530 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13540 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
13550 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
13560 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13570 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13580 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13590 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
135a0 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
135b0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
135c0 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
135d0 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
135e0 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
135f0 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13600 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13610 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13620 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13630 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13640 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
13650 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13660 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13670 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13680 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13690 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
136a0 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
136b0 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
136c0 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
136d0 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
136e0 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
136f0 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13700 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13710 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13730 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13740 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
13750 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
13760 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13770 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13780 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13790 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
137a0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
137b0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
137c0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
137d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
137e0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
137f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13800 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13810 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13820 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13830 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13850 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
13860 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13870 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13880 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13890 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
138a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
138b0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
138c0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
138d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
138e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
138f0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13900 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13910 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13920 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13930 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13940 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13960 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13970 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13990 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
139a0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
139b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
139c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
139d0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
139e0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
139f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13a00 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13a30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13a40 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
13a50 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13a60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13a80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13a90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13aa0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13ab0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13ac0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13ad0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13ae0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13af0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13b00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13b10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13b20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13b30 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13b40 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
13b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13b60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13b70 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13b80 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13b90 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13ba0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13bb0 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13bc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13bd0 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13be0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13bf0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13c00 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13c10 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13c20 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13c30 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13c40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13c60 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13c70 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13c80 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13c90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
13ca0 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
13cb0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
13cc0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
13cd0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
13ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13d00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13d10 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
13d20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d50 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
13d60 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
13d70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13d80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13d90 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13db0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
13dd0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
13de0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13df0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13e00 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13e10 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13e20 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13e30 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13e40 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13e50 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13e60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13e70 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13e80 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13e90 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13ea0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13eb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13ec0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13ed0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13ee0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13ef0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13f00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13f10 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13f20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13f30 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13f40 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13f50 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13f60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13f70 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13f80 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13f90 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13fa0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13fb0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13fc0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13fd0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13fe0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13ff0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
14000 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
14010 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14020 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14030 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14040 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14050 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14060 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14070 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14080 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14090 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
140a0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
140b0 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
140c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
140d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
140e0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
140f0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
14100 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
14110 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14120 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14130 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14150 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14160 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14170 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14180 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14190 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
141a0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
141b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
141c0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
141d0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
141e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
141f0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14200 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
14210 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14220 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14230 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14240 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14250 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14260 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14270 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14280 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14290 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
142a0 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
142b0 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
142c0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
142d0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
142e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
142f0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14300 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
14310 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14320 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14330 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14340 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14350 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14360 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14370 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
14380 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14390 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
143a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
143b0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
143c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
143d0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
143e0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
143f0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14400 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14410 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14420 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14430 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14440 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14450 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14460 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14470 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14480 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14490 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
144a0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
144b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
144c0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
144d0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
144e0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
144f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14500 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14510 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14520 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14530 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14540 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14550 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14560 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14570 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14580 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14590 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
145a0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
145b0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
145c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145d0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
145e0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
145f0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14600 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14610 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14620 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14630 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14640 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14650 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14660 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14670 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14680 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14690 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
146a0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
146b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
146c0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
146d0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
146e0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
146f0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14700 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14710 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14720 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14730 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14740 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14750 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14760 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14770 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14780 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14790 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
147a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
147b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
147c0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
147d0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
147e0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
147f0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14800 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14810 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14820 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14830 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14840 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14850 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14860 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14870 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14890 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
148a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
148b0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
148c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
148d0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
148e0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
148f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14900 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14920 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14930 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14940 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14950 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14960 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14970 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14980 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14990 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
149a0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
149b0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
149c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
149d0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
149e0 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
149f0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14a00 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14a10 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14a20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14a30 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14a40 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14a50 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14a60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14a70 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14a80 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14a90 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14aa0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14ab0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14ac0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14ad0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14ae0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14af0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14b00 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14b10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14b20 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14b30 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14b40 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14b50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14b60 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14b70 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14b80 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14b90 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14ba0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14bb0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14bc0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14bd0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14be0 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14bf0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14c00 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14c10 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14c20 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14c30 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14c40 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14c50 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14c60 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14c70 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14c80 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14c90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14ca0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14cb0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14cc0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14cd0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14ce0 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14cf0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14d00 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14d10 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14d20 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14d30 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14d40 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14d50 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14d60 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14d70 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14d80 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14d90 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14da0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14db0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14dc0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14dd0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14de0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14df0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14e00 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14e10 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14e20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14e30 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14e60 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14e70 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
14e80 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
14e90 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
14ea0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
14eb0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
14ec0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
14ed0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14ee0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
14ef0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
14f00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
14f10 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
14f20 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
14f30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
14f60 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
14f70 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
14f80 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
14f90 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
14fa0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
14fb0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
14fc0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
14fd0 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
14fe0 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
14ff0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15000 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15010 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
15020 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15030 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
15040 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
15050 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
15060 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
15070 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
15080 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15090 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
150a0 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
150b0 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
150c0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
150d0 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
150e0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
150f0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15100 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15110 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
15120 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
15130 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
15140 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15150 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
15160 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15170 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15180 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15190 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
151a0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
151b0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
151c0 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
151d0 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
151e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
151f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15200 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15210 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
15220 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
15230 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
15240 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15250 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
15260 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15270 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15280 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15290 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
152a0 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
152b0 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
152c0 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
152d0 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
152e0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
152f0 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15300 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15310 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
15320 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
15330 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15340 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15350 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15360 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15370 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15380 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15390 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
153a0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
153b0 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
153c0 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
153d0 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
153e0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
153f0 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15400 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15410 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
15420 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
15450 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15460 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15470 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15480 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15490 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
154a0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
154b0 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
154c0 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
154d0 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
154e0 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
154f0 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15500 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15510 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
15520 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
15530 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15540 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
15550 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
15560 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15570 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15580 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15590 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
155a0 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
155b0 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
155c0 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
155d0 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
155e0 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
155f0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15600 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15610 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
15620 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
15630 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
15640 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
15650 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
15660 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15670 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15680 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15690 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
156a0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
156b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
156c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
156d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
156e0 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
156f0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15700 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15710 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
15720 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
15730 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
15740 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15750 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
15760 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15770 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15780 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15790 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
157a0 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
157b0 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
157c0 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
157d0 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
157e0 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
157f0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15800 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15820 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
15830 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
15840 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
15850 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15880 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15890 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
158c0 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
158d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
158e0 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15900 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15910 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15920 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15930 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15940 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15950 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15960 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15970 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15990 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
159a0 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
159b0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
159c0 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
159d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
159e0 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
159f0 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15a00 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15a10 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15a20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15a30 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15a40 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15a50 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15a60 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15a70 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15a80 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15a90 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15aa0 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15ab0 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15ac0 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15ad0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15ae0 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15af0 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15b00 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15b10 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15b20 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15b30 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15b40 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15b50 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15b60 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15b70 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15b80 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15b90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15ba0 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15bb0 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15bc0 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15bd0 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15be0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15bf0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15c00 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15c10 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15c20 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15c30 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15c40 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15c50 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15c60 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15c70 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15c80 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15c90 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15ca0 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15cb0 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15cc0 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15cd0 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15ce0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15cf0 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15d00 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15d10 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15d20 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15d40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15d50 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15d60 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15d70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15d80 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15d90 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15da0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15db0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15dc0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15dd0 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15de0 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15df0 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15e00 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15e10 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15e20 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15e30 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15e40 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15e50 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15e60 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15e70 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
15e80 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
15e90 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
15ea0 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
15eb0 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
15ec0 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
15ed0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
15ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
15f00 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15f10 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
15f20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f30 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
15f40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15f50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15f60 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
15f70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f80 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
15f90 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
15fa0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
15fb0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
15fc0 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
15fd0 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
15fe0 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
15ff0 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16000 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16010 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
16020 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
16030 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
16040 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
16050 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
16060 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
16070 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
16080 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
16090 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
160a0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
160b0 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
160c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
160d0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
160e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
160f0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16100 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16120 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
16130 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
16140 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
16150 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
16160 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16180 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16190 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
161a0 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
161b0 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
161c0 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
161d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
161e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
161f0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16200 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16210 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
16220 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
16230 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16250 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
16260 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16270 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16280 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16290 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
162a0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
162b0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
162c0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
162d0 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
162e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
162f0 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16300 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16320 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16330 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16340 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16350 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16360 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16370 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16380 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16390 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
163a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
163b0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
163c0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
163d0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
163e0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
163f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16400 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16410 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16420 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16430 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16440 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16450 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16460 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16470 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16480 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16490 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
164a0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
164b0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
164c0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
164d0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
164e0 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
164f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16500 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16510 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16520 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16530 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16540 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16550 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16560 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16570 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16580 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16590 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
165a0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
165b0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
165c0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
165d0 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
165e0 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
165f0 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16600 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16610 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16620 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16630 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16640 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16650 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16660 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16670 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16680 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16690 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
166a0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
166b0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
166c0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
166d0 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
166e0 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
166f0 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16700 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16710 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
16720 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
16730 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
16740 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16750 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
16760 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16770 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16780 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
167a0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
167b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
167c0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
167d0 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
167e0 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
167f0 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16800 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16810 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
16820 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
16830 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
16840 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
16850 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
16860 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16870 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16880 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16890 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
168a0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
168b0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
168c0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
168d0 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
168e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
168f0 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16900 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16910 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16920 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16930 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16940 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16950 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16960 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16970 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16980 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16990 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
169a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
169b0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
169c0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
169d0 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
169e0 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
169f0 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16a00 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16a10 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16a20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16a30 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16a40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16a50 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16a60 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16a70 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16a80 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16a90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16aa0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16ab0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16ac0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16ad0 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16ae0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16af0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16b00 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16b10 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16b20 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16b30 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16b40 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16b50 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16b60 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16b70 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16b80 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16b90 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16ba0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16bb0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16bc0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16bd0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16be0 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16bf0 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16c00 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16c10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16c20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16c30 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16c40 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16c50 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
16c60 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16c70 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16c80 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16c90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16ca0 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16cb0 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16cc0 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16cd0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16ce0 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16cf0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16d00 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16d10 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16d20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16d30 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16d40 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16d50 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16d60 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16d70 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16d80 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16d90 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16da0 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16db0 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16dc0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16de0 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16df0 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16e00 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16e10 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16e20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16e30 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16e40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16e50 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16e60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16e70 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
16e80 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
16e90 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
16ea0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
16ec0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
16ed0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
16ee0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
16ef0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
16f00 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
16f10 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
16f20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
16f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
16f40 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
16f50 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16f60 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
16f70 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
16f80 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
16f90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
16fa0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16fb0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
16fc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
16fd0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
16fe0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
16ff0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
17000 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17010 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
17020 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17030 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
17040 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
17050 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
17060 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
17070 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
17080 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
17090 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
170a0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
170b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
170c0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
170d0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
170e0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
170f0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
17100 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17110 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
17120 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17130 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17140 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17150 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17160 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17170 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17180 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17190 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
171a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
171b0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
171c0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
171d0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
171e0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
171f0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17200 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
17210 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
17220 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17230 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17240 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17250 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17260 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17270 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17280 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17290 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
172a0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
172b0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
172c0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
172d0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
172e0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
172f0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17300 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
17310 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
17320 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17330 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17340 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17350 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17360 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17370 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17380 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17390 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
173a0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
173b0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
173c0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
173d0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
173e0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
173f0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17400 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
17410 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
17420 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17430 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
17450 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
17460 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17470 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
17480 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
17490 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
174a0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
174b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
174c0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
174d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
174e0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
174f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17500 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17510 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
17520 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
17530 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
17540 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
17550 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
17560 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
17570 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
17580 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
17590 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
175a0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
175b0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
175c0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
175d0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
175e0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
175f0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
17600 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
17610 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
17620 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
17630 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
17640 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
17650 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
17660 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
17670 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
17680 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
17690 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
176a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
176b0 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
176c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
176d0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
176e0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
176f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17700 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
17710 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
17720 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
17730 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
17740 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
17750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17760 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
17770 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
17780 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
17790 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
177a0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
177b0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
177c0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
177d0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
177e0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
177f0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
17800 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
17810 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
17820 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
17830 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
17840 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
17850 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
17860 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
17870 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
17880 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
17890 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
178a0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
178b0 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
178c0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
178d0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
178e0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
178f0 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
17900 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
17910 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
17920 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
17930 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
17940 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
17950 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
17960 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
17970 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
17980 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
17990 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
179a0 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
179b0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
179c0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
179d0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
179e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
179f0 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
17a00 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
17a10 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
17a20 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
17a30 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
17a40 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
17a50 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17a60 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17a70 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
17a80 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
17a90 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
17aa0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
17ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
17ac0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
17ad0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
17ae0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17af0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
17b00 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
17b10 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
17b20 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
17b30 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
17b40 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
17b50 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
17b60 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
17b70 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
17b80 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
17b90 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
17ba0 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
17bb0 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
17bc0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
17bd0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
17be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17bf0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17c00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17c20 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
17c30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
17c40 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
17c50 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pPg);..    /* If
17c60 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
17c70 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
17c80 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
17c90 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
17ca0 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
17cb0 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
17cc0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
17cd0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
17ce0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
17cf0 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
17d00 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
17d10 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
17d20 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
17d30 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
17d40 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
17d50 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
17d60 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
17d70 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
17d80 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17d90 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69  NOMEM);.    sqli
17da0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
17db0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
17dc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17dd0 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
17de0 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
17df0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17e00 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
17e10 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17e20 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
17e30 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
17e40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
17e50 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
17e60 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
17e70 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
17e80 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17e90 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
17ea0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17eb0 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
17ec0 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
17ed0 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
17ee0 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
17ef0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
17f00 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
17f10 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
17f20 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
17f30 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17f40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
17f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17f60 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
17f70 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
17f80 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
17f90 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
17fa0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
17fb0 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
17fc0 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
17fd0 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
17fe0 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
17ff0 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
18000 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
18010 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
18020 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
18030 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
18040 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18050 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
18060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18070 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
18080 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
18090 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
180a0 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
180b0 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
180c0 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
180d0 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
180e0 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
180f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18100 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
18110 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
18120 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
18130 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
18140 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18150 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
18160 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18170 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18180 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18190 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
181a0 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
181b0 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
181c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
181d0 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
181e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
181f0 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18200 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18210 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
18220 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
18230 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18240 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
18250 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
18260 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18270 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18280 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18290 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
182a0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
182b0 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
182c0 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
182d0 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
182e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
182f0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18300 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
18310 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
18320 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18330 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
18340 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
18350 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
18360 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18370 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18380 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18390 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
183a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
183b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
183c0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
183d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
183e0 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
183f0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18400 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
18410 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
18420 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
18430 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18440 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
18450 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
18460 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18470 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18480 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
184a0 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
184b0 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
184c0 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
184d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
184e0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
184f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18500 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
18510 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
18520 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
18530 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
18540 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
18550 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
18560 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18570 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18580 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18590 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
185a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
185b0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
185c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
185d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
185e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
185f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18600 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
18610 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
18620 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18630 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
18640 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
18650 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
18660 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18670 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18680 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18690 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
186a0 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
186b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
186c0 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
186d0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
186e0 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
186f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18700 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
18710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18720 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
18730 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
18740 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
18750 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18760 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18770 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18780 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18790 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
187a0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
187b0 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
187c0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
187d0 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
187e0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
187f0 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
18800 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
18810 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
18820 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
18830 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
18840 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
18850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
18860 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
18870 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
18880 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
18890 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
188a0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
188b0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
188c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
188d0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
188e0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
188f0 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
18900 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
18910 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
18920 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
18930 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
18940 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18950 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
18960 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
18970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18980 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
18990 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
189a0 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
189b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
189c0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
189d0 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  _out;..  /* Load
189e0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
189f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18a00 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
18a10 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71  ned from.  ** sq
18a20 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
18a30 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
18a40 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
18a50 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20     Also obtain. 
18a60 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73   ** sufficient s
18a70 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72  pace (in zMaster
18a80 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65  Ptr) to hold the
18a90 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72   names of master
18aa0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
18ab0 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  les extracted fr
18ac0 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62  om regular rollb
18ad0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20  ack-journals..  
18ae0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
18af0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
18b00 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
18b10 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
18b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18b30 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18b40 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20  .  nMasterPtr = 
18b50 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
18b60 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  +1;.  zMasterJou
18b70 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
18b80 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65  lloc((int)nMaste
18b90 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
18ba0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
18bb0 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
18bc0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
18bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18be0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18bf0 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
18c00 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
18c10 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
18c20 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
18c30 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18c40 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
18c50 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
18c60 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
18c70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18c80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18c90 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
18ca0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18cb0 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
18cc0 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
18cd0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
18ce0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
18cf0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
18d00 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
18d10 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
18d20 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
18d30 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
18d40 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
18d50 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
18d60 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
18d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18d90 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
18db0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
18dc0 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
18dd0 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
18de0 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
18df0 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
18e00 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
18e10 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
18e20 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
18e30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
18e40 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
18e50 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
18e60 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
18e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
18e80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
18e90 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
18ea0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
18eb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
18ec0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18ed0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
18ee0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18ef0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
18f00 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
18f10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
18f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18f40 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18f50 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
18f60 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
18f70 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
18f80 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
18f90 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
18fa0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
18fb0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
18fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18fd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18fe0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18ff0 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19000 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
19010 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
19020 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
19030 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
19040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19050 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19060 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19070 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19080 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
19090 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
190a0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
190b0 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
190c0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
190d0 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
190e0 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
190f0 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19100 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19110 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
19120 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
19130 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
19140 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19150 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19160 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19170 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19180 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19190 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
191a0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
191b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
191c0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
191d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
191e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
191f0 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19200 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
19210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19220 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
19230 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
19240 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19250 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
19260 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19270 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19280 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19290 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
192a0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
192b0 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
192c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
192d0 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
192e0 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
192f0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19300 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
19310 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
19320 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19330 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
19340 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
19350 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
19360 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19370 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19380 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19390 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
193a0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
193b0 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
193c0 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
193d0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
193e0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
193f0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19400 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
19410 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
19420 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
19430 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
19440 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19450 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19460 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19470 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19480 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19490 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
194a0 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
194b0 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
194c0 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
194d0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
194e0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
194f0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19500 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
19510 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
19520 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
19530 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
19540 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19550 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19570 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19580 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19590 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
195a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
195b0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
195c0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
195d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
195e0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
195f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19600 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
19610 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19620 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
19630 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19640 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
19650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19660 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19670 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19680 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19690 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
196a0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
196b0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
196c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
196d0 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
196e0 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
196f0 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
19700 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
19710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19720 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
19730 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
19740 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
19750 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
19760 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
19770 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
19780 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
19790 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
197a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
197b0 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
197c0 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
197d0 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
197e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
197f0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
19800 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
19810 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
19820 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
19830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19840 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
19850 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
19860 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Size);.        i
19870 66 28 20 6e 65 77 53 69 7a 65 3c 70 50 61 67 65  f( newSize<pPage
19880 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 29 7b 0a  r->nMapValid ){.
19890 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
198a0 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d 20 6e 65  ->nMapValid = ne
198b0 77 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  wSize;.        }
198c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
198d0 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
198e0 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
198f0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19900 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
19910 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
19920 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
19930 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
19940 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19950 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
19960 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19970 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19980 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19990 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
199a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
199b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
199c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
199d0 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
199e0 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
199f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19a10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19a20 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19a30 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19a40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19a60 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
19a70 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
19a80 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
19a90 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
19aa0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
19ab0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
19ac0 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
19ad0 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
19ae0 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
19af0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
19b00 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
19b10 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
19b20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
19b30 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
19b40 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
19b50 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
19b60 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
19b70 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
19b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
19b90 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
19ba0 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
19bb0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
19bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
19bd0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
19be0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
19bf0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
19c00 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
19c10 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
19c20 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
19c30 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
19c40 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
19c50 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
19c60 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
19c70 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
19c80 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
19c90 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20  sed used .** to 
19ca0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
19cb0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
19cc0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
19cd0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
19ce0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
19cf0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
19d00 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
19d10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
19d20 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
19d30 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
19d40 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
19d50 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
19d60 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
19d70 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
19d80 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
19d90 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
19da0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
19db0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
19dc0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
19dd0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
19de0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
19df0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
19e00 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
19e10 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19e20 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
19e30 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
19e40 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
19e50 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
19e60 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
19e70 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
19e80 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
19e90 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
19ea0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
19eb0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
19ec0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
19ed0 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
19ee0 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
19ef0 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
19f00 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
19f10 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
19f20 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
19f30 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
19f40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
19f50 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
19f60 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
19f70 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
19f80 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
19f90 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
19fa0 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
19fb0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
19fc0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
19fd0 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
19fe0 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
19ff0 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1a000 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1a010 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1a020 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a030 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a040 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1a050 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1a060 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a070 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1a080 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1a090 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1a0a0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1a0b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a0c0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1a0d0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1a0e0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1a0f0 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1a100 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a110 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a120 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1a130 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1a140 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a150 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1a160 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1a170 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1a180 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1a190 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1a1a0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1a1b0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1a1c0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1a1d0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1a1e0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1a1f0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1a200 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1a210 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a220 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1a230 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1a240 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1a250 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1a260 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1a270 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1a280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1a290 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1a2a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a2b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1a2c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1a2d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1a2e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1a2f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1a300 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1a310 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1a320 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1a330 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1a340 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1a350 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1a360 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a370 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a380 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1a390 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1a3a0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1a3b0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1a3c0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1a3d0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1a3e0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1a3f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1a400 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1a410 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1a420 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1a430 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a440 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1a450 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1a460 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1a470 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1a480 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1a490 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a4a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1a4b0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1a4c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1a4d0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1a4e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1a4f0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1a500 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a510 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1a520 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1a530 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1a540 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1a550 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1a560 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1a570 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a580 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1a590 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1a5a0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1a5b0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1a5c0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1a5d0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1a5e0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1a5f0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1a600 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a610 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1a620 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1a630 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a640 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1a650 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1a660 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1a670 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1a680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1a690 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1a6a0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1a6b0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1a6c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1a6d0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1a6e0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1a6f0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1a700 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1a710 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1a720 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1a730 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1a740 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1a750 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1a760 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1a770 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1a780 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1a790 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1a7a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a7b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1a7c0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1a7d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1a7e0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1a7f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1a800 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1a810 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1a820 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1a830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a840 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1a850 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1a860 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1a870 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1a880 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1a890 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1a8a0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1a8b0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1a8c0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1a8d0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1a8e0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1a8f0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a900 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a910 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a920 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a930 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a940 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a950 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a960 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a970 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a980 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a990 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a9a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a9b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a9c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a9d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a9e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a9f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1aa00 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1aa10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1aa20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1aa30 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1aa40 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1aa50 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1aa60 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1aa70 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1aa80 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1aa90 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1aaa0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1aab0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1aac0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1aad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1aae0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1aaf0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1ab00 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1ab10 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1ab20 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1ab30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1ab40 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1ab50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1ab60 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1ab70 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1ab80 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1ab90 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1aba0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1abb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1abc0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1abd0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1abe0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1abf0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1ac00 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1ac10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1ac20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1ac30 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1ac40 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1ac50 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1ac60 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1ac70 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1ac80 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1ac90 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1aca0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1acb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1acc0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1acd0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1ace0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1acf0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1ad00 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1ad10 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1ad20 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1ad30 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1ad40 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1ad50 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1ad60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1ad70 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1ad80 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1ad90 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1ada0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1adb0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1adc0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1add0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ade0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1adf0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1ae20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1ae30 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1ae40 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1ae50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ae60 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1ae70 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1ae80 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1ae90 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1aea0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1aeb0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1aec0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1aed0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1aee0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1aef0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1af20 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1af30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af50 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1af60 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1af70 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1af80 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1af90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1afa0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1afb0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1afc0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1afd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1afe0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1aff0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1b000 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1b010 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b020 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b030 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b040 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b050 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b060 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b070 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b080 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b090 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b0a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b0b0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b0c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b0d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b0e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b0f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b100 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b110 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b120 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b130 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b140 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b150 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b160 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b170 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b180 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b190 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b1a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b1b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b1c0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b1d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b1e0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b1f0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b200 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b210 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b220 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b230 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b240 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b250 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b260 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b270 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b280 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b290 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b2a0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b2b0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b2c0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b2d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b2e0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b2f0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b300 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b310 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b320 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b330 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b340 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b350 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b360 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b370 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b380 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b3a0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b3b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b3c0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b3d0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b3e0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b3f0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b400 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b410 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b420 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b430 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b450 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b460 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b470 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b480 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b490 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b4a0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b4b0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b4c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b4d0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b4e0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b4f0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b500 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b510 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b520 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b530 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b550 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b560 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b570 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b590 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b5a0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b5b0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b5c0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b5d0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b5e0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b5f0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b600 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b610 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b620 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b640 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b650 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b660 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b670 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b6a0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b6b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b6c0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b6d0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b6e0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b6f0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b700 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b710 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b720 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b730 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b740 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b750 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b760 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b770 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b780 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b790 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b7a0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b7b0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b7c0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b7d0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b7e0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b7f0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b800 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b810 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b840 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b850 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b860 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b870 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b880 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b890 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b8a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b8b0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b8c0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b8d0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b8e0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b8f0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b900 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b910 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b920 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b930 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b940 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b950 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b960 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b970 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b980 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b990 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b9a0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b9b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b9c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b9d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b9e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b9f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba00 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1ba10 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1ba20 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1ba30 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1ba40 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1ba50 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1ba60 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1ba70 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1ba80 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1ba90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1baa0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bab0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bac0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bad0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bae0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1baf0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb00 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bb10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bb20 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bb30 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bb40 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bb50 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bb60 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bb70 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bb80 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bb90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bba0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bbb0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bbc0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bbd0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bbe0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bbf0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bc10 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bc20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bc30 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bc40 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bc50 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bc60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bc70 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bc80 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bc90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bca0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bcb0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bcc0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bcd0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bce0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bcf0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd00 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bd10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bd20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bd30 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bd40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bd50 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bd60 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1bd70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bd80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bd90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bda0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1bdb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1bdc0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1bdd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1bde0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1bdf0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be00 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1be10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1be20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1be30 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1be40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1be50 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1be60 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1be70 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1be80 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1be90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bea0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1beb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bed0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bee0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bef0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bf10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bf20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bf30 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1bf40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1bf50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1bf60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bf70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1bf80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1bf90 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1bfb0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1bfc0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1bfd0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1bfe0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1bff0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1c000 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1c010 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1c020 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1c030 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1c040 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1c050 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1c060 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1c070 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1c080 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1c090 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1c0a0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1c0b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1c0c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1c0d0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1c0e0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1c0f0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1c100 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1c110 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c120 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1c130 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c140 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1c150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1c160 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1c170 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1c180 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1c190 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1c1a0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1c1b0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1c1c0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1c1d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1c1e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1c1f0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1c200 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1c210 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1c220 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1c230 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1c240 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1c250 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1c260 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1c270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1c280 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1c290 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1c2a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c2b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1c2c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1c2d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1c2e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1c2f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1c300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c310 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1c320 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1c330 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1c340 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1c350 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1c360 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1c370 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1c380 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1c390 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1c3a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1c3b0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1c3c0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1c3d0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1c3e0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1c3f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c400 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72  BUG.  if( pPager
1c410 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1c420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
1c430 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
1c440 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1c450 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c460 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  GED,0);.  }.#end
1c470 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1c480 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1c490 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1c4a0 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1c4b0 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1c4c0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1c4d0 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1c4e0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1c4f0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1c500 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1c510 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1c520 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1c530 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1c540 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1c550 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1c560 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1c570 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1c580 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1c590 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1c5a0 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1c5b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1c5c0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1c5d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1c5e0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1c5f0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1c600 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1c610 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1c620 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1c630 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1c640 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1c650 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1c660 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1c670 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1c680 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1c690 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1c6a0 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1c6b0 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1c6c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1c6d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1c6e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1c6f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1c700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1c710 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1c720 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1c730 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c740 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c750 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c760 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c770 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1c780 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c790 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c7a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1c7b0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1c7c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1c7d0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1c7e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1c7f0 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1c800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c810 65 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a  erSync(pPager);.
1c820 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c840 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1c850 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1c860 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1c870 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1c880 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c890 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c8b0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1c8c0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1c8d0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1c8e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1c8f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1c900 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1c910 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1c920 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1c930 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1c940 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1c950 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1c960 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1c970 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1c980 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1c990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c9a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1c9b0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1c9c0 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1c9d0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1c9e0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1c9f0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1ca00 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1ca10 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1ca20 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1ca30 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1ca40 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1ca50 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1ca60 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1ca70 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1ca80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1ca90 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1caa0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1cab0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1cac0 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1cad0 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1cae0 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1caf0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1cb00 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1cb10 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1cb20 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1cb30 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1cb40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1cb50 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1cb60 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1cb70 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1cb80 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1cb90 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1cba0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1cbb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cbc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1cbd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1cbe0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1cbf0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1cc00 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1cc10 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1cc20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1cc30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1cc40 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1cc50 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1cc60 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1cc70 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1cc80 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1cc90 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1cca0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1ccb0 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1ccc0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1ccd0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1cce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1ccf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1cd00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1cd10 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20   isInWal = 0;   
1cd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1cd30 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
1cd40 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
1cd50 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1cd60 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1cd70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1cd80 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1cd90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1cda0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1cdb0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1cdc0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1cdd0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1cde0 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
1cdf0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1ce00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ce10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ce20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
1ce30 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
1ce40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ce50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ce60 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1ce70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ce80 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
1ce90 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1cea0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1ceb0 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1cec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ced0 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
1cee0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
1cef0 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
1cf00 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
1cf10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf20 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
1cf30 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1cf40 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cf50 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cf60 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1cf70 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1cf80 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1cf90 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1cfa0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cfb0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1cfc0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1cfd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cfe0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1cff0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d000 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d010 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d020 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d030 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d040 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d050 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d060 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d070 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d080 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d090 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d0a0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d0b0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d0c0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d0d0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d0e0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d0f0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d110 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d120 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d130 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d140 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d150 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d160 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d170 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d180 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d190 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d1a0 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d1b0 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d1c0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d1d0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d1e0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d1f0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d200 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d210 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d220 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d230 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d240 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d250 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d260 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1d270 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1d280 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1d290 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1d2a0 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1d2b0 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1d2c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1d2d0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1d2e0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1d2f0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d300 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d310 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1d320 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1d330 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1d340 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1d350 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1d360 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1d370 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1d380 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1d390 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1d3a0 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1d3b0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1d3c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1d3d0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1d3e0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1d3f0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1d400 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1d410 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1d420 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1d430 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1d440 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1d450 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1d460 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1d470 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1d480 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1d490 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1d4a0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1d4b0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1d4c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d4d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1d4e0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d4f0 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1d500 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1d510 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1d520 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1d530 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1d540 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1d550 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1d560 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1d570 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1d580 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1d590 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1d5a0 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1d5b0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d5c0 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1d5d0 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1d5e0 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1d5f0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1d600 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1d610 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1d620 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1d630 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1d640 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1d650 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1d660 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1d670 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1d680 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1d690 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1d6a0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1d6b0 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1d6c0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1d6d0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1d6e0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1d6f0 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1d700 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1d710 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1d720 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1d730 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1d740 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1d750 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1d760 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1d770 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1d780 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1d790 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1d7a0 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1d7b0 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1d7c0 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1d7d0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d7e0 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1d7f0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1d800 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d810 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d820 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1d830 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1d840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d850 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1d860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1d870 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1d880 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1d890 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d8a0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1d8b0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1d8c0 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1d8d0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d8e0 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1d8f0 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1d900 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1d910 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1d920 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1d930 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1d940 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1d950 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1d960 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1d970 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1d980 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1d990 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1d9a0 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1d9b0 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1d9c0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1d9d0 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1d9e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1d9f0 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1da00 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1da10 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1da20 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1da30 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1da40 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1da50 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1da60 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1da70 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1da80 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1da90 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1daa0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1dab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1dac0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1dad0 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1dae0 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1daf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1db00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1db10 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1db20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70  PgHdr *pPg;..  p
1db30 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1db40 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1db50 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1db60 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1db70 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1db80 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1db90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1dba0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1dbb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1dbc0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1dbd0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1dbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dbf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1dc00 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1dc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1dc20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1dc30 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1dc40 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1dc50 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1dc60 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1dc70 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1dc80 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1dc90 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1dca0 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1dcb0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1dcc0 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1dcd0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1dce0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1dcf0 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1dd00 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1dd10 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1dd20 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1dd30 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1dd40 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1dd50 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1dd60 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1dd70 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1dd80 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1dd90 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1dda0 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1ddb0 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1ddc0 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1ddd0 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1dde0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1ddf0 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1de00 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1de10 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1de20 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1de30 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1de40 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1de50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1de60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1de70 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1de80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1de90 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1dea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1deb0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1dec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ded0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1df00 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1df10 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1df20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1df30 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1df40 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1df50 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1df60 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1df70 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1df80 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1df90 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1dfa0 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1dfb0 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1dfc0 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1dfd0 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1dfe0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1dff0 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1e000 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1e010 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1e020 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1e030 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1e040 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e050 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1e060 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1e070 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1e080 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1e090 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e0a0 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1e0b0 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1e0c0 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1e0d0 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1e0e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e0f0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1e100 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1e110 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1e120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e130 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1e140 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1e150 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1e160 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1e170 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1e180 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1e190 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1e1a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e1b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e1c0 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1e1d0 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1e1e0 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1e1f0 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1e200 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1e210 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1e220 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1e230 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1e240 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1e250 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1e260 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1e270 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1e280 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1e290 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1e2a0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1e2b0 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1e2c0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1e2d0 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1e2e0 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1e2f0 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1e300 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1e310 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1e320 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1e330 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1e340 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1e350 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1e360 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1e370 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1e380 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1e390 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1e3a0 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1e3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1e3c0 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1e3d0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1e3e0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1e3f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e400 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1e410 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1e420 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e440 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1e450 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1e460 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e490 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1e4a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e4b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e4c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1e4d0 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  st */.#if define
1e4e0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1e4f0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1e500 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20  E_CHECK_PAGES). 
1e510 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1e540 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65  over pages */.#e
1e550 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1e560 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1e570 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1e580 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1e590 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1e5a0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1e5b0 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1e5c0 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1e5d0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1e5e0 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1e5f0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e600 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1e610 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1e620 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1e630 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1e640 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1e650 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1e660 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1e670 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1e680 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1e690 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1e6a0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1e6b0 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1e6c0 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1e6d0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1e6e0 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1e6f0 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1e700 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1e710 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1e720 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1e730 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1e740 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1e750 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1e760 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1e770 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72  dr *p;.    PgHdr
1e780 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1e790 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  st;.    nList = 
1e7a0 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  0;.    for(p=pLi
1e7b0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1e7c0 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74  )!=0; p=p->pDirt
1e7d0 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1e7e0 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1e7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65   ){.        ppNe
1e800 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1e810 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b  .        nList++
1e820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e830 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1e840 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1e850 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
1e860 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
1e870 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
1e880 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
1e890 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1e8a0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
1e8b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1e8c0 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
1e8d0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1e8e0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1e8f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1e900 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1e910 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1e920 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
1e930 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1e940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e950 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1e960 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  up ){.    PgHdr 
1e970 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
1e980 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1e990 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1e9a0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1e9b0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1e9c0 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1e9d0 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1e9e0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1e9f0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ea00 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ea10 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1ea20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1ea30 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1ea40 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1ea50 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1ea60 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1ea70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1ea80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ea90 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1eaa0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1eab0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1eac0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1ead0 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1eae0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1eaf0 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1eb00 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1eb10 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1eb20 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1eb30 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1eb40 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1eb50 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1eb60 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1eb70 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1eb80 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1eb90 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1eba0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1ebb0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1ebc0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1ebd0 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1ebe0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1ebf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ec00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ec20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ec30 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1ec40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ec50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1ec60 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1ec70 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ec80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1ec90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1eca0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1ecb0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1ecc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1ecd0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1ece0 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1ecf0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1ed00 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1ed10 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1ed20 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1ed30 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1ed40 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1ed50 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1ed60 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1ed70 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1ed80 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1ed90 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1eda0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1edb0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1edc0 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1edd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1ede0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1edf0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1ee00 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1ee10 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1ee20 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1ee30 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1ee40 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1ee50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1ee60 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1ee70 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1ee80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1ee90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1eea0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1eeb0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1eec0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1eed0 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1eee0 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1eef0 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1ef00 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1ef10 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ef20 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1ef30 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1ef40 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1ef50 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1ef60 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1ef70 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1ef80 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1ef90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1efa0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1efb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1efc0 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1efd0 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1efe0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1eff0 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f000 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f010 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f020 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f030 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f040 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f050 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f070 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f080 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f0b0 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f0c0 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f0d0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f0e0 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f0f0 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f100 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f110 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f120 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f130 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f140 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f150 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f160 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f170 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f180 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f190 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f1a0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f1b0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f1c0 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f1d0 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f1e0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f1f0 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f200 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f210 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f220 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f230 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f240 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f250 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f260 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f270 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f280 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f290 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f2a0 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1f2b0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f2c0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1f2d0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1f2e0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1f2f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f300 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1f310 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1f320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f330 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1f340 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1f350 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1f360 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1f370 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1f380 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1f390 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1f3a0 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1f3b0 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1f3c0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1f3d0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1f3e0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f3f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1f400 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f420 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1f430 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1f440 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f450 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f460 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f470 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f480 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f490 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f4a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f4b0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f4c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f4d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f4f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1f500 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1f510 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f520 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1f530 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1f540 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f550 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1f560 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1f570 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f580 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1f590 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1f5a0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1f5b0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1f5c0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1f5d0 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1f5e0 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1f5f0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1f600 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1f610 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1f620 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1f630 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1f640 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1f650 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1f660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1f670 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1f680 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f690 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1f6a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f6b0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1f6c0 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1f6d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f6e0 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1f6f0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1f700 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1f710 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1f720 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1f730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f740 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1f750 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1f760 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1f770 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1f780 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1f790 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1f7a0 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1f7b0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1f7c0 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1f7d0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1f7e0 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1f7f0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1f800 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1f810 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1f820 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1f830 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1f840 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f850 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1f860 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1f870 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1f880 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1f890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f8a0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1f8b0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1f8c0 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1f8d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1f8e0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1f8f0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1f900 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1f910 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1f920 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1f930 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1f940 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1f950 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1f960 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1f970 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1f980 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1f990 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1f9a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1f9b0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1f9c0 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1f9d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f9e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f9f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fa00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1fa10 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1fa20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1fa30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1fa40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1fa50 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1fa60 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fa80 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1fa90 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1faa0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fac0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fad0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1fae0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
1faf0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1fb00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1fb10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fb20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1fb30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fb40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1fb50 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
1fb60 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
1fb70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fb80 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
1fb90 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
1fba0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
1fbb0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1fbc0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1fbd0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1fbe0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1fbf0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1fc00 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1fc10 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1fc20 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1fc30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fc40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fc50 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1fc60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1fc70 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1fc80 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1fc90 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1fca0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fcb0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1fcc0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1fcd0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1fce0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1fcf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1fd00 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1fd10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1fd20 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1fd30 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1fd40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fd50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1fd60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1fd70 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1fd80 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1fd90 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1fda0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1fdb0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1fdc0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1fdd0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1fde0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1fdf0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1fe00 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1fe10 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1fe20 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
1fe30 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
1fe40 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
1fe50 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
1fe60 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
1fe70 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
1fe80 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
1fe90 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
1fea0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
1feb0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
1fec0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
1fed0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
1fee0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
1fef0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
1ff00 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
1ff10 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
1ff20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
1ff30 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
1ff40 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1ff50 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
1ff60 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
1ff70 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
1ff80 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
1ff90 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
1ffa0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
1ffb0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
1ffc0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1ffd0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
1ffe0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1fff0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20000 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20010 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20020 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20030 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20040 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20050 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20060 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
20070 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20080 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20090 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
200a0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
200b0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
200c0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
200d0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
200e0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
200f0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20100 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20110 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20120 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20130 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20140 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20150 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20160 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20180 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
201a0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
201b0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
201c0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
201d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
201e0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
201f0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20200 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20210 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20220 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20230 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20240 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20250 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20260 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20270 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20280 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20290 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
202a0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
202b0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
202c0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
202d0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
202e0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
202f0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20300 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20310 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20320 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20330 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20340 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20350 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20360 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20370 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20380 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20390 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
203a0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
203b0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
203c0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
203d0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
203e0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
203f0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20400 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20410 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20420 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20430 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20440 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20450 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20460 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20470 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20480 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20490 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
204a0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
204b0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
204c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
204d0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
204e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
204f0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20500 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20510 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20530 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20540 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20550 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20560 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20570 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20580 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20590 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
205a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
205b0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
205c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
205d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
205e0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
205f0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20600 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20610 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20620 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20630 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20640 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20650 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20660 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20670 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20680 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20690 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
206a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
206b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
206c0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
206d0 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
206e0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
206f0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
20700 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
20710 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
20720 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
20730 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
20740 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20750 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20760 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20770 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20780 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20790 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
207a0 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
207b0 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
207c0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
207d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
207e0 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
207f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
20800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20810 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
20820 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20830 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
20840 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20850 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20860 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20870 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20880 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20890 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
208a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
208b0 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
208c0 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
208d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
208e0 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
208f0 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20900 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20910 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
20920 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20930 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
20940 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20950 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20960 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20970 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20980 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20990 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
209a0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
209b0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
209c0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
209d0 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
209e0 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
209f0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20a00 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20a10 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
20a20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20a30 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
20a40 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20a50 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20a60 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20a70 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20a80 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20a90 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20aa0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20ab0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20ac0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20ad0 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20ae0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20af0 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
20b00 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20b10 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
20b20 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
20b30 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
20b40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
20b50 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
20b60 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
20b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20b80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20b90 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20ba0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20bb0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20bc0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20bd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20be0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20c00 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
20c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20c30 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
20c40 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
20c50 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
20c60 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20c70 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20c80 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
20c90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
20ca0 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
20cb0 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
20cc0 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
20cd0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20ce0 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
20cf0 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
20d00 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
20d10 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
20d20 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
20d30 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
20d40 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
20d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20d60 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20d70 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
20d80 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
20d90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20da0 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
20db0 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
20dc0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
20dd0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
20de0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
20df0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
20e00 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
20e10 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
20e20 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
20e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20e40 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
20e50 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
20e60 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
20e70 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
20e80 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
20e90 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
20ea0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
20eb0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
20ec0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
20ed0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
20ee0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
20ef0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
20f00 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
20f10 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
20f20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
20f30 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
20f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
20f50 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
20f60 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
20f70 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
20f80 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
20f90 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
20fa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
20fb0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
20fc0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
20fd0 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
20fe0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
20ff0 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
21000 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
21010 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
21020 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21030 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21040 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21050 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21070 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21080 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
21090 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
210a0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
210b0 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
210c0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
210d0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
210e0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
210f0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
21100 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
21110 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
21120 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21130 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21140 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21150 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21160 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
21170 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
21180 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
21190 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
211a0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
211b0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
211c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
211d0 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
211e0 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
211f0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
21200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21210 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
21220 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21240 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21250 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21260 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
21270 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
21280 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
21290 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
212a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
212b0 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
212c0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
212d0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
212e0 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
212f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
21300 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
21310 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
21320 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21330 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21340 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21350 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21360 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
21370 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
21380 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
21390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
213a0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
213b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
213c0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
213d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
213e0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
213f0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
21400 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
21410 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
21420 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21430 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
21440 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21450 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21460 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
21470 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
21480 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
21490 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
214a0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
214b0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
214c0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
214d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
214e0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
214f0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
21500 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
21510 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
21520 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
21530 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
21540 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
21550 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
21560 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
21570 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
21580 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
21590 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
215a0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
215b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
215c0 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
215d0 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
215e0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
215f0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
21600 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
21610 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
21620 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
21630 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
21640 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
21650 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
21660 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
21670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21680 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
21690 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
216a0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
216b0 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
216c0 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
216d0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
216e0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
216f0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
21700 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
21710 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
21720 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
21730 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
21740 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
21750 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
21760 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
21770 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
21780 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
21790 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
217a0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
217b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
217c0 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
217d0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
217e0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
217f0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
21800 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
21810 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
21820 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
21830 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
21840 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
21850 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21860 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
21870 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
21880 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
21890 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
218a0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
218b0 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
218c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
218d0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
218e0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
218f0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
21900 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
21910 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
21920 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
21930 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
21940 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
21950 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
21960 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
21970 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
21980 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21990 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
219a0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
219b0 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
219c0 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
219d0 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
219e0 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
219f0 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
21a00 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
21a10 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
21a20 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
21a30 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
21a40 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
21a50 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
21a60 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
21a70 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
21a80 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
21a90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21aa0 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
21ab0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21ac0 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
21ad0 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
21ae0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21af0 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
21b00 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
21b10 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
21b20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
21b30 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
21b40 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
21b50 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
21b60 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
21b70 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
21b80 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
21b90 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
21ba0 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
21bb0 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
21bc0 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
21bd0 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
21be0 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
21bf0 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
21c00 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
21c10 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
21c20 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
21c30 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21c40 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
21c50 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
21c60 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
21c70 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
21c80 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
21c90 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
21ca0 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
21cb0 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
21cc0 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
21cd0 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
21ce0 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
21cf0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
21d00 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
21d10 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
21d20 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
21d30 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
21d40 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
21d50 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
21d60 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
21d70 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
21d80 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
21d90 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
21da0 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
21db0 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
21dc0 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
21dd0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
21de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21df0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
21e00 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
21e10 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
21e20 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21e30 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
21e40 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
21e50 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
21e60 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  vel(.  Pager *pP
21e70 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
21e80 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
21e90 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
21ea0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  r */.  int level
21eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
21ec0 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
21ed0 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f  us.  1=OFF, 2=NO
21ee0 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20  RMAL, 3=FULL */ 
21ef0 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79   .  int bFullFsy
21f00 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41  nc,       /* PRA
21f10 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  GMA fullfsync */
21f20 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c  .  int bCkptFull
21f30 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47  Fsync    /* PRAG
21f40 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75  MA checkpoint_fu
21f50 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20  llfsync */.){.  
21f60 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31  assert( level>=1
21f70 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a   && level<=3 );.
21f80 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
21f90 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
21fa0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21fb0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
21fc0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
21fd0 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
21fe0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
21ff0 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  :0;.  if( pPager
22000 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
22010 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22020 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
22030 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22040 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
22050 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a  ( bFullFsync ){.
22060 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22070 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22080 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
22090 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
220a0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
220b0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
220c0 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  if( bCkptFullFsy
220d0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
220e0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
220f0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22100 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22110 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22120 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
22140 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22150 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22160 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
22170 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22180 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22190 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
221a0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
221b0 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
221c0 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
221d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
221e0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
221f0 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
22200 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
22210 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
22220 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
22230 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
22240 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
22250 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
22260 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
22270 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
22280 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
22290 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
222a0 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
222b0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
222c0 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
222d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
222e0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
222f0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
22300 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
22310 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
22320 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
22330 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
22340 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
22350 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
22360 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
22370 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
22380 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
22390 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
223a0 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
223b0 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
223c0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
223d0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
223e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
223f0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
22400 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
22410 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
22420 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
22430 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
22440 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
22450 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
22460 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
22470 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
22480 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
22490 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
224a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
224b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
224c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
224d0 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
224e0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
224f0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
22500 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
22510 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
22530 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
22540 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22550 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
22560 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
22570 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
22580 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
22590 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
225a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
225b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
225c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
225d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
225e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
225f0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
22600 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
22610 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
22620 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
22630 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
22640 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22650 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22660 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
22670 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22680 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
22690 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
226a0 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
226b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
226c0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
226d0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
226e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
226f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
22700 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
22710 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22720 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
22730 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
22740 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
22750 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
22760 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
22770 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
22780 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
22790 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
227a0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
227b0 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
227c0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
227d0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
227e0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
227f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22800 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
22810 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
22820 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
22830 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22840 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
22850 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
22860 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
22870 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22880 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
22890 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
228a0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
228b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
228c0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
228d0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
22900 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
22910 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
22920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
22950 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
22960 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
22970 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22980 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22990 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
229a0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
229b0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
229c0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
229d0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
229e0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
229f0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
22a00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
22a10 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
22a20 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
22a30 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
22a40 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
22a50 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
22a60 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
22a70 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22a80 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22a90 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22aa0 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22ab0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22ac0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22ad0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22ae0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b00 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
22b10 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
22b20 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
22b30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
22b40 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
22b50 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
22b60 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
22b70 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22b80 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22b90 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22ba0 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22bb0 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
22bc0 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
22bd0 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
22be0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
22bf0 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
22c00 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
22c10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
22c20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
22c30 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
22c40 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
22c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
22c60 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
22c70 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
22c80 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
22c90 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
22ca0 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
22cb0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
22cc0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
22cd0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
22ce0 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
22cf0 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
22d00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
22d10 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
22d20 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
22d30 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
22d40 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
22d50 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
22d60 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
22d70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22d80 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
22d90 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
22da0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
22db0 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
22dc0 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
22dd0 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
22de0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
22df0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
22e00 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
22e10 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
22e20 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
22e30 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
22e40 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
22e50 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
22e60 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
22e70 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
22e80 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
22e90 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
22ea0 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
22eb0 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
22ec0 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
22ed0 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
22ee0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
22ef0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
22f00 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
22f10 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
22f20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
22f30 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
22f40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
22f50 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
22f60 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
22f70 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
22f80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
22f90 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
22fa0 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
22fb0 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
22fc0 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
22fd0 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
22fe0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
22ff0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
23000 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23010 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
23020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
23030 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
23040 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
23050 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
23060 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
23070 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
23080 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
23090 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
230a0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
230b0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
230c0 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
230d0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
230e0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
230f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23100 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
23110 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
23120 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
23130 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
23140 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
23150 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
23160 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
23170 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
23180 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
23190 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
231a0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
231b0 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
231c0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
231d0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
231e0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
231f0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
23200 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
23210 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
23220 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
23230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23240 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
23250 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
23260 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
23270 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
23280 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23290 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
232a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
232b0 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
232c0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
232d0 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
232e0 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
232f0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
23300 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
23310 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
23320 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
23330 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
23340 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
23350 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
23360 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
23370 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
23380 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
23390 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
233a0 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
233b0 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
233c0 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
233d0 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
233e0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
233f0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
23400 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
23410 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
23420 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
23430 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
23440 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
23450 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
23460 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
23470 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
23480 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
23490 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
234a0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
234b0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
234c0 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
234d0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
234e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
234f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
23500 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
23510 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
23520 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
23530 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
23540 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
23550 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
23560 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
23570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23580 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
23590 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
235a0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
235b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
235c0 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
235d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
235e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
235f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
23600 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
23610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23630 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
23640 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
23650 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
23660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
23670 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
23680 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
23690 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
236a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
236b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
236c0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
236d0 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
236e0 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
236f0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
23700 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
23710 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
23720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
23730 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
23740 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
23750 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
23760 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
23770 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
23780 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
23790 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
237a0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Size);.    }.  }
237b0 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
237c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
237d0 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
237e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
237f0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
23800 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
23810 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
23820 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
23830 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
23840 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
23850 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
23860 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
23870 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
23880 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
23890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
238a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
238b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
238c0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
238d0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
238e0 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
238f0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
23900 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
23910 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
23920 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
23930 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
23940 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
23950 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
23960 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
23970 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
23980 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
23990 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
239a0 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
239b0 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
239c0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
239d0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
239e0 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
239f0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
23a00 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
23a10 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
23a20 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
23a30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23a40 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
23a50 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
23a60 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
23a70 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
23a80 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
23a90 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
23aa0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
23ab0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
23ac0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
23ad0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
23ae0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
23af0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
23b00 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
23b10 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
23b20 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
23b30 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
23b40 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
23b50 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
23b60 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
23b70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23b80 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
23b90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23ba0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
23bb0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
23bc0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
23bd0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
23be0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23bf0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
23c00 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
23c10 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
23c20 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
23c30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
23c40 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
23c50 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
23c60 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
23c70 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
23c80 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
23c90 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
23ca0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
23cb0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
23cc0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
23cd0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
23ce0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
23cf0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
23d00 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
23d10 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
23d20 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
23d30 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
23d40 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
23d50 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
23d60 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
23d70 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
23d80 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
23d90 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
23da0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
23db0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
23dc0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
23dd0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
23de0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
23df0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
23e00 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
23e10 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
23e20 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
23e30 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23e40 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
23e50 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
23e60 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23e70 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
23e80 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23e90 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
23ea0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23eb0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
23ec0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
23ed0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
23ee0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
23ef0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
23f00 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23f10 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
23f20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
23f30 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
23f40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
23f50 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
23f60 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
23f70 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
23f80 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
23f90 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
23fa0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
23fb0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
23fc0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
23fd0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
23fe0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
23ff0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
24000 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
24010 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
24020 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
24030 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
24040 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24050 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
24060 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
24070 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
24080 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
24090 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
240a0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
240b0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
240c0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
240d0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
240e0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
240f0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
24100 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
24110 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
24120 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
24130 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
24140 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
24150 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
24160 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
24170 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
24180 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
24190 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
241a0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
241b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
241c0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
241d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
241e0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
241f0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
24200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24210 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
24220 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
24230 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24240 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
24250 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
24260 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
24270 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
24280 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
24290 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
242a0 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
242b0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
242c0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
242d0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
242e0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
242f0 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
24300 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
24310 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
24320 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
24330 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24340 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
24350 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
24360 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
24370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24380 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
24390 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
243a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
243b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
243c0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
243d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
243e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
243f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
24400 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
24410 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
24420 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
24430 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
24440 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
24450 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
24460 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24470 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
24480 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
24490 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
244a0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
244b0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
244c0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
244d0 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
244e0 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
244f0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
24500 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24510 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
24520 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
24530 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24540 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
24550 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
24560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24570 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
24580 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
24590 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
245a0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
245b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
245c0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
245d0 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
245e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
245f0 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
24600 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
24610 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
24620 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
24630 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
24640 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
24650 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
24660 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
24670 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
24680 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
24690 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
246a0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
246b0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
246c0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
246d0 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
246e0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
246f0 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
24700 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
24710 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
24720 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
24730 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
24740 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
24750 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
24760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24770 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
24780 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24790 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
247a0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
247b0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
247c0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
247d0 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
247e0 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
247f0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
24800 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
24820 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
24830 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24840 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
24850 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24880 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
24890 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
248a0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
248b0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
248c0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
248d0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
248e0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
248f0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
24900 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
24910 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
24920 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
24930 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
24940 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
24950 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
24960 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
24970 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24980 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
24990 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
249a0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
249b0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
249c0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
249d0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
249e0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
249f0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
24a00 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
24a10 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
24a20 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
24a30 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
24a40 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
24a50 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
24a60 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
24a70 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24a80 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
24a90 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
24aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24ab0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
24ac0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
24ad0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
24ae0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
24af0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
24b00 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
24b10 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
24b20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
24b30 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
24b40 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
24b50 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
24b60 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24b70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24b80 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
24b90 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
24ba0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
24bb0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
24bc0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
24bd0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
24be0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
24bf0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
24c00 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
24c10 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
24c20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
24c30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
24c40 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
24c50 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
24c60 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
24c70 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
24c80 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
24c90 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
24ca0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
24cb0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
24cc0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
24cd0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
24ce0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
24cf0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
24d00 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
24d10 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
24d20 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
24d30 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
24d40 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
24d50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24d60 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
24d70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
24d80 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
24d90 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
24da0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
24db0 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
24dc0 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
24dd0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
24de0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
24df0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
24e00 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
24e10 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
24e20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
24e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
24e40 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
24e50 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
24e60 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
24e70 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
24e80 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
24e90 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
24ea0 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
24eb0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
24ec0 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
24ed0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
24ee0 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
24ef0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
24f00 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
24f10 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
24f20 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
24f30 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
24f40 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
24f50 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
24f60 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
24f70 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
24f80 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
24f90 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
24fa0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
24fb0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
24fc0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
24fd0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
24fe0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
24ff0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
25000 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
25010 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
25020 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
25030 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
25040 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25050 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
25060 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
25070 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25080 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
25090 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
250a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
250b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
250c0 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
250d0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
250e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
250f0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
25100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
25110 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
25120 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
25130 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
25140 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
25150 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
25160 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
25170 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
25180 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
25190 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
251a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
251b0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
251c0 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
251d0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
251e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
251f0 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
25200 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
25210 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
25220 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
25230 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
25240 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
25250 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
25260 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
25270 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
25280 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
25290 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
252a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
252b0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
252c0 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
252d0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
252e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
252f0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
25300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25310 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
25320 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
25330 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
25340 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
25350 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
25360 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
25370 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
25380 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25390 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
253a0 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
253b0 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
253c0 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
253d0 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
253e0 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
253f0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
25400 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
25410 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
25420 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
25430 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
25440 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
25450 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
25460 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
25470 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
25480 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
25490 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
254a0 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
254b0 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
254c0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
254d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
254e0 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
254f0 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
25500 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
25510 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
25520 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
25530 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
25540 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
25550 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
25560 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25570 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
25580 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
25590 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
255a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
255b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
255c0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
255d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
255e0 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
255f0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
25600 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
25610 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
25620 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
25630 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
25640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
25650 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
25660 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
25670 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
25680 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
25690 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
256a0 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
256b0 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
256c0 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
256d0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
256e0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
256f0 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
25700 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
25710 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
25720 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
25730 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
25740 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
25750 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
25760 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
25770 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
25780 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
25790 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
257a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
257b0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
257c0 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
257d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
257e0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
257f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25800 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
25810 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
25820 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
25830 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
25840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
25850 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
25860 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
25870 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25880 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
25890 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
258a0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
258b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
258c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
258d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
258e0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
258f0 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
25900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 6e 63 6c  urn rc;.}..#incl
25910 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e  ude <sys/mman.h>
25920 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6d 61 70 20 61 6e  ../*.** Unmap an
25930 79 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65  y mapping of the
25940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
25950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
25960 67 65 72 55 6e 6d 61 70 28 50 61 67 65 72 20 2a  gerUnmap(Pager *
25970 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
25980 50 61 67 65 72 2d 3e 70 4d 61 70 20 29 7b 0a 20  Pager->pMap ){. 
25990 20 20 20 6d 75 6e 6d 61 70 28 70 50 61 67 65 72     munmap(pPager
259a0 2d 3e 70 4d 61 70 2c 20 70 50 61 67 65 72 2d 3e  ->pMap, pPager->
259b0 6e 4d 61 70 29 3b 0a 20 20 20 20 70 50 61 67 65  nMap);.    pPage
259c0 72 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 20  r->pMap = 0;.   
259d0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 20 3d 20   pPager->nMap = 
259e0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
259f0 4d 61 70 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  MapValid = 0;.  
25a00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25a10 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
25a20 69 6e 74 20 70 61 67 65 72 4d 61 70 28 50 61 67  int pagerMap(Pag
25a30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
25a40 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 73 7a 20  nt rc;.  i64 sz 
25a50 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
25a60 70 50 61 67 65 72 2d 3e 70 4d 61 70 3d 3d 30 20  pPager->pMap==0 
25a70 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3d  && pPager->nMap=
25a80 3d 30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  =0 );..  rc = sq
25a90 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
25aa0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 73 7a 29  pPager->fd, &sz)
25ab0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25ac0 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 30 20 29 7b  TE_OK && sz>0 ){
25ad0 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
25ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
25af0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
25b00 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
25b10 4e 54 4c 5f 47 45 54 46 44 2c 20 28 76 6f 69 64  NTL_GETFD, (void
25b20 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
25b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25b40 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  {.      void *pM
25b50 61 70 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 2c  ap = mmap(0, sz,
25b60 20 50 52 4f 54 5f 52 45 41 44 2c 20 4d 41 50 5f   PROT_READ, MAP_
25b70 53 48 41 52 45 44 2c 20 66 64 2c 20 30 29 3b 0a  SHARED, fd, 0);.
25b80 20 20 20 20 20 20 69 66 28 20 70 4d 61 70 3d 3d        if( pMap==
25b90 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
25ba0 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
25bb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25bc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
25bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
25be0 65 72 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  er->pMap = pMap;
25bf0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
25c00 4d 61 70 56 61 6c 69 64 20 3d 20 70 50 61 67 65  MapValid = pPage
25c10 72 2d 3e 6e 4d 61 70 20 3d 20 73 7a 3b 0a 20 20  r->nMap = sz;.  
25c20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
25c30 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
25c40 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65  int pagerAcquire
25c50 4d 61 70 50 61 67 65 28 50 61 67 65 72 20 2a 70  MapPage(Pager *p
25c60 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
25c70 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65  , PgHdr **ppPage
25c80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a  ){.  int rc;.  *
25c90 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  ppPage = 0;..  a
25ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
25cb0 57 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Wal==0 );..  if(
25cc0 20 4d 45 4d 44 42 3d 3d 30 20 26 26 20 70 50 61   MEMDB==0 && pPa
25cd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
25ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
25cf0 65 72 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  er->pMap==0 ){. 
25d00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4d       rc = pagerM
25d10 61 70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ap(pPager);.    
25d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25d30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25d50 70 67 6e 6f 21 3d 31 20 26 26 20 70 50 61 67 65  pgno!=1 && pPage
25d60 72 2d 3e 70 4d 61 70 20 0a 20 20 20 20 20 26 26  r->pMap .     &&
25d70 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 56 61 6c   pPager->nMapVal
25d80 69 64 3e 3d 28 28 69 36 34 29 70 67 6e 6f 2a 70  id>=((i64)pgno*p
25d90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
25da0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 50   .    ){.      P
25db0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 20 20 69  gHdr *p;.      i
25dc0 66 28 20 70 50 61 67 65 72 2d 3e 70 46 72 65 65  f( pPager->pFree
25dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20   ){.        p = 
25de0 70 50 61 67 65 72 2d 3e 70 46 72 65 65 3b 0a 20  pPager->pFree;. 
25df0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
25e00 46 72 65 65 20 3d 20 70 2d 3e 70 44 69 72 74 79  Free = p->pDirty
25e10 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 44 69  ;.        p->pDi
25e20 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
25e30 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72   memset(p->pExtr
25e40 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
25e50 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
25e60 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
25e70 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33  (PgHdr *)sqlite3
25e80 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
25e90 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65  f(PgHdr) + pPage
25ea0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
25eb0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
25ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25ed0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  EM;.        p->p
25ee0 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
25ef0 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70  &p[1];.        p
25f00 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
25f10 4d 4d 41 50 3b 0a 20 20 20 20 20 20 20 20 70 2d  MMAP;.        p-
25f20 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
25f30 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
25f40 50 61 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  Pager;.      }..
25f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
25f60 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
25f70 29 26 70 5b 31 5d 20 29 3b 0a 20 20 20 20 20 20  )&p[1] );.      
25f80 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
25f90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
25fa0 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
25fb0 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 20  GHDR_MMAP );.   
25fc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
25fd0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
25fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
25ff0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 20  >nRef==1 );..   
26000 20 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 26 28     p->pData = &(
26010 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 4d  (u8 *)pPager->pM
26020 61 70 29 5b 28 69 36 34 29 28 70 67 6e 6f 2d 31  ap)[(i64)(pgno-1
26030 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
26040 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  Size];.      p->
26050 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
26060 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70     pPager->nMmap
26070 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70  Out++;.      *pp
26080 50 61 67 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  Page = p;.    }.
26090 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
260a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
260b0 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c  ic void pagerRel
260c0 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64  easeMapPage(PgHd
260d0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
260e0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
260f0 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
26100 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20  ->nMmapOut--;.  
26110 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
26120 61 67 65 72 2d 3e 70 46 72 65 65 3b 0a 20 20 70  ager->pFree;.  p
26130 50 61 67 65 72 2d 3e 70 46 72 65 65 20 3d 20 70  Pager->pFree = p
26140 50 67 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  Pg;.}..static vo
26150 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
26160 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
26170 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
26180 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
26190 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
261a0 70 46 72 65 65 3b 20 70 3b 20 70 3d 70 4e 65 78  pFree; p; p=pNex
261b0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
261c0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73  p->pDirty;.    s
261d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
261e0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68    }.}.../*.** Sh
261f0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
26200 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
26210 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
26220 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
26230 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
26240 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
26250 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
26260 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
26270 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
26280 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
26290 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
262a0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
262b0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
262c0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
262d0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
262e0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
262f0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
26300 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
26310 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
26320 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
26330 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
26340 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
26350 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
26360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
26370 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
26380 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
26390 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
263a0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
263b0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
263c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
263d0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
263e0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
263f0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
26400 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
26410 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
26420 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
26430 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
26440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26450 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
26460 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
26470 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
26480 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
26490 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
264a0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
264b0 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
264c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
264d0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
264e0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
264f0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
26500 55 6e 6d 61 70 28 70 50 61 67 65 72 29 3b 0a 20  Unmap(pPager);. 
26510 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26520 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  s(pPager);.  /* 
26530 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26540 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
26550 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
26560 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
26570 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
26580 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
26590 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
265a0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
265b0 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
265c0 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
265d0 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
265e0 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
265f0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
26600 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
26610 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
26620 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
26630 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
26640 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
26650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
26660 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
26670 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
26680 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
26690 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
266a0 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
266b0 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
266c0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
266d0 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
266e0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
266f0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
26700 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
26710 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
26720 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
26730 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
26740 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
26750 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
26760 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
26770 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
26780 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
26790 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
267a0 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
267b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
267c0 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
267d0 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
267e0 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
267f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
26800 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
26810 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26820 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
26830 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
26840 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
26850 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
26860 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
26870 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
26880 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
26890 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
268a0 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
268b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
268c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
268d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
268e0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
268f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
26900 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
26910 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
26920 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
26930 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
26940 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
26950 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
26960 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
26970 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
26980 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
26990 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
269a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
269b0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
269c0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
269d0 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
269e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
269f0 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
26a00 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
26a10 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
26a20 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
26a30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
26a40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
26a50 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
26a60 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
26a70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
26a80 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
26a90 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
26aa0 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
26ab0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
26ac0 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
26ad0 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
26ae0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
26af0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
26b00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
26b10 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
26b20 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
26b30 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
26b40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26b50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
26b60 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
26b70 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
26b80 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
26b90 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
26ba0 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
26bb0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
26bc0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
26bd0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
26be0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
26bf0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
26c00 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
26c10 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
26c20 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
26c30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
26c40 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
26c50 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
26c60 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
26c70 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
26c80 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
26c90 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
26ca0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
26cb0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
26cc0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
26cd0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
26ce0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
26cf0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
26d00 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
26d10 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
26d20 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
26d30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
26d40 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
26d50 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
26d60 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
26d70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26d80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
26d90 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
26da0 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
26db0 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
26dc0 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
26dd0 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
26de0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
26df0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
26e00 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
26e10 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
26e20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
26e30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
26e40 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
26e50 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
26e60 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
26e70 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
26e80 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
26e90 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
26ea0 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
26eb0 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
26ec0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
26ed0 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
26ee0 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
26ef0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
26f00 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
26f10 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
26f20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
26f30 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
26f40 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
26f50 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
26f60 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
26f70 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
26f80 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
26f90 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
26fa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26fb0 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
26fc0 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
26fd0 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
26fe0 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
26ff0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27000 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
27010 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
27020 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
27030 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
27040 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
27050 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
27060 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
27070 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
27080 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
27090 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
270a0 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
270b0 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
270c0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
270d0 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
270e0 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
270f0 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
27100 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
27110 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
27120 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
27130 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
27140 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
27150 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
27160 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
27170 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
27180 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
27190 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
271a0 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
271b0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
271c0 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
271d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
271e0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
271f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27200 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
27210 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27220 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
27230 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27240 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
27250 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27270 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27280 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27290 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
272a0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
272b0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
272c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
272d0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
272e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
272f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27300 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
27310 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
27320 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
27330 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
27340 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
27350 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
27360 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
27370 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
27380 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27390 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
273a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
273b0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
273c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
273d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
273e0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
273f0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
27400 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
27410 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
27420 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
27430 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
27440 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27450 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27460 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
27470 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
27480 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
27490 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
274a0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
274b0 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
274c0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
274d0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
274e0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
274f0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
27500 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
27510 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
27520 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
27530 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
27540 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
27550 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
27560 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
27570 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
27580 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
27590 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
275a0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
275b0 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
275c0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
275d0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
275e0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
275f0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
27600 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
27610 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
27620 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
27630 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
27640 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
27650 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
27660 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
27670 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
27680 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
27690 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
276a0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
276b0 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
276c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
276d0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
276e0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
276f0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
27700 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
27710 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
27720 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
27730 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
27740 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
27750 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
27760 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
27770 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
27780 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
27790 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
277a0 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
277b0 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
277c0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
277d0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
277e0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
277f0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
27800 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
27810 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27820 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
27830 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
27840 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
27850 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
27860 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
27870 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
27880 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
27890 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
278a0 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
278b0 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
278c0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
278d0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
278e0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
278f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27900 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
27910 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
27920 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
27930 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
27940 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
27950 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
27960 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
27970 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
27980 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
27990 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
279a0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
279b0 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
279c0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
279d0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
279e0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
279f0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
27a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
27a10 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
27a20 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
27a30 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
27a40 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
27a50 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
27a60 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
27a70 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
27a80 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
27a90 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
27aa0 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
27ab0 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
27ac0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
27ad0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
27ae0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
27af0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
27b00 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
27b10 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
27b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27b30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
27b40 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
27b50 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
27b60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27b70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
27b80 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
27b90 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
27ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
27bb0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
27bc0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
27bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27be0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
27bf0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
27c00 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
27c10 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
27c20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
27c40 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
27c50 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
27c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
27c70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
27c80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
27c90 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
27ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27cb0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
27cc0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
27cd0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
27ce0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
27cf0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
27d00 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
27d10 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
27d20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
27d30 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
27d40 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
27d50 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
27d60 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
27d70 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
27d80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
27d90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
27da0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
27db0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
27dc0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
27dd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
27de0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
27df0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
27e00 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
27e10 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
27e20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
27e30 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
27e40 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
27e50 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
27e60 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
27e70 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
27e80 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
27e90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
27ea0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
27eb0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
27ec0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
27ed0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
27ee0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
27ef0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
27f00 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
27f10 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
27f20 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
27f30 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
27f40 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
27f50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27f60 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
27f70 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
27f80 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
27f90 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
27fa0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
27fb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
27fc0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
27fd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28000 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
28010 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
28020 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28040 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
28050 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28060 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
28070 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
28080 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
28090 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
280a0 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
280b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
280c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
280d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
280e0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
280f0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28100 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28110 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28120 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28130 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28140 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
28150 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28160 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28170 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
28180 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28190 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
281a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
281b0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
281c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
281d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
281e0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
281f0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
28200 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28230 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
28240 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28260 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
28270 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
28280 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
28290 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
282a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
282b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
282c0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
282d0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
282e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
282f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28300 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28310 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
28320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
28330 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28340 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
28350 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
28360 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
28370 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
28380 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
28390 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
283a0 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
283b0 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
283c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
283d0 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
283e0 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
283f0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
28400 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
28410 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28420 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
28430 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
28440 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
28450 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28460 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28470 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
28490 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
284a0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
284b0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
284c0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
284d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
284e0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
284f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28500 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
28510 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
28520 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
28530 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
28540 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
28550 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
28560 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
28570 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
28580 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
28590 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
285a0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
285b0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
285c0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
285d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
285e0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
285f0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
28600 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
28610 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
28620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
28630 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
28640 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
28650 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
28660 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
28670 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
28680 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
28690 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
286a0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
286b0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
286c0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
286d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
286e0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
286f0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
28700 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
28710 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
28720 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
28730 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
28740 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
28750 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
28760 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
28770 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
28780 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
28790 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
287a0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
287b0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
287c0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
287d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
287e0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
287f0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
28800 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
28810 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
28820 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
28830 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
28840 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
28850 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
28860 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
28870 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
28880 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
28890 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
288a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
288b0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
288c0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
288d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
288e0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
288f0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
28900 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
28910 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
28920 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
28930 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
28940 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
28950 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
28960 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
28970 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
28980 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
28990 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
289a0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
289b0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
289c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
289d0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
289e0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
289f0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
28a00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
28a10 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
28a20 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
28a30 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
28a40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28a50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
28a60 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
28a70 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
28a80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
28a90 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
28aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28ad0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
28ae0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
28af0 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
28b00 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
28b10 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
28b20 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
28b30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28b40 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
28b50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
28b60 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
28b70 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
28b80 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
28b90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
28ba0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
28bb0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
28bc0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
28bd0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
28be0 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
28bf0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
28c00 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
28c10 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
28c20 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
28c30 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
28c40 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
28c50 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
28c60 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
28c70 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
28c80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
28c90 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
28ca0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
28cb0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
28cc0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
28cd0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
28ce0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
28cf0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
28d00 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
28d10 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
28d20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
28d30 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
28d40 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
28d50 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
28d60 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
28d70 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
28d80 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
28d90 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
28da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28db0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
28dc0 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
28dd0 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ize ){.    sqlit
28de0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
28df0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
28e00 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
28e10 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
28e20 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
28e30 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
28e40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
28e50 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
28e60 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
28e70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
28e80 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
28e90 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
28ea0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
28eb0 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
28ec0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
28ed0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
28ee0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
28ef0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
28f00 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
28f10 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
28f20 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
28f30 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
28f40 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
28f50 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
28f60 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
28f70 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
28f80 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
28f90 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
28fa0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
28fb0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
28fc0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
28fd0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
28fe0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
28ff0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
29000 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
29010 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
29020 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
29030 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
29040 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
29050 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
29060 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
29070 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
29080 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
29090 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
290a0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
290b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
290c0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
290d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
290e0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
290f0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
29100 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
29140 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
29150 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
29160 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29170 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
29180 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
29190 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
291a0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
291b0 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
291c0 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
291d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
291e0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
291f0 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
29200 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
29210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
29220 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
29230 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
29240 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
29250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29260 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
29270 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
29280 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
29290 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
292a0 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
292b0 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
292c0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
292d0 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
292e0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
292f0 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
29300 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29310 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
29320 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
29330 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
29340 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29350 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
29360 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
29370 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
29380 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
29390 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
293a0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
293b0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
293c0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
293d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
293e0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
293f0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
29400 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
29410 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
29420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
29430 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
29440 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
29450 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
29460 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
29470 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
29480 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
29490 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
294a0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
294b0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
294c0 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
294d0 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
294e0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
294f0 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
29500 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
29510 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29520 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
29530 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
29540 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
29550 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
29560 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
29570 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29580 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
29590 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
295a0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
295b0 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
295c0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
295d0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
295e0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
295f0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
29600 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
29610 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
29620 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
29630 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
29640 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
29650 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
29660 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
29670 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29680 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
29690 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
296a0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
296b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
296c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
296d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
296e0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
296f0 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
29700 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
29710 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
29720 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
29730 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
29740 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
29750 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
29760 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
29770 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
29780 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
29790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
297a0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
297b0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
297c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
297d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
297e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
297f0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
29800 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
29810 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
29820 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
29830 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
29840 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29850 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29860 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
29870 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
29880 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
29890 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
298a0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
298b0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
298c0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
298d0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
298e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
298f0 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
29900 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
29910 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
29920 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
29930 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
29940 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
29950 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
29960 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
29970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
29980 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
29990 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
299a0 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
299b0 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
299c0 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
299d0 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
299e0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
299f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
29a00 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
29a10 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
29a20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
29a30 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
29a40 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
29a50 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
29a60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
29a70 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
29a80 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
29a90 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
29aa0 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
29ab0 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
29ac0 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
29ad0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
29ae0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
29af0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29b00 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
29b10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29b20 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
29b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29b40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29b50 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
29b60 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
29b70 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
29b80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
29b90 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
29ba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29bb0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
29bc0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
29bd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
29be0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
29bf0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
29c00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
29c10 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
29c20 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
29c30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29c40 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29c50 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
29c60 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
29c70 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
29c80 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
29c90 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
29ca0 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
29cb0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
29cc0 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
29cd0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29ce0 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
29cf0 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
29d00 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
29d10 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
29d20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
29d30 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
29d40 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
29d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29d60 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
29d70 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
29d80 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
29d90 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
29da0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
29db0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
29dc0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
29dd0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
29de0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
29df0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
29e00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
29e10 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
29e20 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
29e30 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
29e40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29e50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29e60 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
29e70 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
29e80 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
29e90 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
29ea0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29ed0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
29ee0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
29ef0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
29f00 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
29f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
29f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29f30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
29f40 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
29f50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
29f60 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
29f70 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
29f80 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
29f90 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
29fa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
29fc0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29fd0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
29fe0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
29ff0 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2a000 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2a010 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2a020 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2a030 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2a040 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2a050 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2a060 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2a070 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2a080 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2a090 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2a0a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a0b0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2a0c0 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2a0d0 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2a0e0 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2a0f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2a100 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2a110 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2a120 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2a130 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2a140 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2a150 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2a160 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2a170 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a180 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2a190 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2a1a0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2a1b0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2a1c0 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2a1d0 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2a1e0 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2a1f0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2a200 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2a210 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2a220 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2a230 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2a240 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2a250 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2a260 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2a270 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2a280 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2a290 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2a2a0 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2a2b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2a2c0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2a2d0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2a2e0 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2a2f0 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2a300 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2a310 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2a320 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2a330 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2a340 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2a350 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2a360 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2a370 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2a380 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2a390 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2a3a0 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2a3b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a3c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2a3d0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2a3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2a3f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2a400 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2a410 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
2a420 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e  lag is set durin
2a430 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2a440 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2a450 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2a460 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2a470 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2a480 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2a490 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2a4a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2a4b0 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2a4c0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2a4d0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2a4e0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2a4f0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2a500 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2a510 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  e doNotSpill fla
2a520 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  g inhibits all c
2a530 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65  ache spilling re
2a540 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2a550 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
2a560 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2a570 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2a580 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2a590 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ck..  **.  ** Sp
2a5a0 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2a5b0 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2a5c0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2a5d0 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2a5e0 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2a5f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2a600 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2a610 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2a620 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2a630 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2a640 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2a650 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2a660 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2a670 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =1.  ** while in
2a680 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2a690 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2a6a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2a6b0 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2a6c0 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2a6d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2a6e0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2a6f0 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2a700 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2a710 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2a720 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2a730 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2a740 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2a750 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2a760 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2a770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a780 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2a790 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e  otSpill ) return
2a7a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2a7b0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2a7c0 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67  yncSpill && (pPg
2a7d0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2a7e0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b  NEED_SYNC)!=0 ){
2a7f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a800 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2a810 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2a820 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2a830 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2a840 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2a850 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2a860 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2a870 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62  . */.    if( sub
2a880 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2a890 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  g) ){ .      rc 
2a8a0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2a8b0 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20  (pPg); .    }.  
2a8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2a8e0 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2a8f0 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2a900 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2a910 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
2a920 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2a930 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
2a940 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
2a950 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2a960 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
2a970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2a980 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
2a990 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
2a9a0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2a9b0 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
2a9c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2a9d0 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
2a9e0 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
2a9f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2aa00 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2aa10 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
2aa20 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
2aa30 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
2aa40 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
2aa50 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
2aa60 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
2aa70 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
2aa80 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2aa90 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
2aaa0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
2aab0 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
2aac0 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
2aad0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
2aae0 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
2aaf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2ab00 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
2ab10 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2ab20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
2ab30 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
2ab40 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2ab50 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
2ab60 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
2ab70 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
2ab80 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
2ab90 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2aba0 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
2abb0 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
2abc0 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
2abd0 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2abe0 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
2abf0 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
2ac00 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
2ac10 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
2ac20 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
2ac30 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
2ac40 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2ac50 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
2ac60 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
2ac70 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
2ac80 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
2ac90 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
2aca0 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
2acb0 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
2acc0 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
2acd0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
2ace0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2acf0 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
2ad00 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
2ad10 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
2ad20 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
2ad30 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
2ad40 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
2ad50 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
2ad60 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
2ad70 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
2ad80 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
2ad90 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
2ada0 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
2adb0 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
2adc0 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
2add0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
2ade0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
2adf0 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
2ae00 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
2ae10 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
2ae20 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
2ae30 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
2ae40 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2ae50 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
2ae60 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2ae70 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
2ae80 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
2ae90 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
2aea0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
2aeb0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2aec0 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
2aed0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2aee0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2aef0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
2af00 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2af10 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
2af20 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2af30 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2af40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2af50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2af60 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2af70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2af80 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2af90 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2afa0 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
2afb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2afc0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
2afd0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
2afe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aff0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
2b000 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
2b010 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2b020 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2b030 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
2b040 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2b050 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
2b060 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2b070 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2b080 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ; .}.../*.** All
2b090 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2b0a0 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
2b0b0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
2b0c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
2b0d0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
2b0e0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
2b0f0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
2b100 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
2b110 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
2b120 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
2b130 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
2b140 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2b150 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
2b160 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2b170 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
2b180 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
2b190 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
2b1a0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2b1b0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
2b1c0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
2b1d0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
2b1e0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
2b1f0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
2b200 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
2b210 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
2b220 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
2b230 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
2b240 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
2b250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2b260 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
2b270 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2b280 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
2b290 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2b2a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
2b2b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2b2c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
2b2d0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
2b2e0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
2b2f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2b300 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
2b310 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
2b320 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
2b330 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
2b340 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
2b350 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
2b360 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2b370 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
2b380 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2b390 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2b3a0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2b3b0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2b3c0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2b3d0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2b3e0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2b3f0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2b400 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2b410 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2b420 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2b430 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2b440 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2b450 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2b460 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2b470 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2b480 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2b490 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2b4a0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2b4b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2b4c0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2b4d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2b4e0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2b4f0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2b500 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2b510 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2b520 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2b530 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2b540 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2b550 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2b560 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2b570 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2b580 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2b590 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2b5a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2b5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b5c0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2b5d0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2b5e0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2b5f0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2b600 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2b610 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2b620 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2b630 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2b640 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b650 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2b660 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2b670 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2b680 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2b690 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2b6a0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2b6b0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2b6c0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2b6d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2b6e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2b6f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b700 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2b710 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2b720 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2b730 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2b740 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2b750 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2b760 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b770 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2b780 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2b790 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2b7a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2b7b0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2b7c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2b7d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2b7e0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2b7f0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2b800 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2b810 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2b820 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2b830 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2b840 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2b850 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2b860 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2b870 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2b880 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2b890 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2b8a0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2b8b0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2b8c0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2b8d0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2b8e0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2b8f0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2b900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2b910 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2b920 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2b930 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2b940 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2b950 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2b960 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2b970 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2b980 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2b990 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2b9a0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2b9b0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2b9c0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2b9d0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2b9e0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2b9f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2ba00 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2ba10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2ba20 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2ba30 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2ba40 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2ba50 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2ba60 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2ba70 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2ba80 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2ba90 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2baa0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2bab0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2bac0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2bad0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2bae0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2baf0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2bb00 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2bb10 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2bb20 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2bb30 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2bb40 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2bb50 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2bb60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bb70 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2bb80 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2bb90 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2bba0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2bbb0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2bbc0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2bbd0 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2bbe0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2bbf0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2bc00 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2bc10 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2bc20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
2bc30 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
2bc40 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
2bc50 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
2bc60 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
2bc70 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
2bc80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2bc90 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
2bca0 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
2bcb0 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
2bcc0 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
2bcd0 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
2bce0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
2bcf0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
2bd00 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
2bd10 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
2bd20 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
2bd30 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2bd40 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
2bd50 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
2bd60 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
2bd70 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
2bd80 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
2bd90 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2bda0 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
2bdb0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2bdc0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2bdd0 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
2bde0 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
2bdf0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2be00 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
2be10 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
2be20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2be30 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2be40 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2be50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2be60 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2be70 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2be80 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2be90 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2bea0 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2beb0 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2bec0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
2bed0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2bee0 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   ){.      zPathn
2bef0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
2bf00 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61  trDup(0, zFilena
2bf10 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
2bf20 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72  Pathname==0  ) r
2bf30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2bf40 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  EM;.      nPathn
2bf50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2bf60 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2bf70 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2bf80 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2bf90 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2bfa0 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2bfb0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2bfc0 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2bfd0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2bfe0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2bff0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2c000 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2c010 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2c020 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2c030 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2c040 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2c050 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2c060 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2c070 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2c080 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2c090 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2c0a0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2c0b0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2c0c0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c0d0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2c0e0 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2c0f0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2c100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2c110 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74  ;.    }.    zPat
2c130 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
2c140 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
2c150 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
2c160 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
2c170 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ils */.    rc = 
2c180 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
2c190 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
2c1a0 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
2c1b0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2c1c0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2c1d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2c1e0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  athname);.    z 
2c1f0 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e  = zUri = &zFilen
2c200 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
2c210 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
2c220 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ];.    while( *z
2c230 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73   ){.      z += s
2c240 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c250 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  )+1;.      z += 
2c260 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c270 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  z)+1;.    }.    
2c280 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b  nUri = (int)(&z[
2c290 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20  1] - zUri);.    
2c2a0 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20  assert( nUri>=0 
2c2b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c2c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
2c2d0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
2c2e0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2c2f0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2c300 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
2c310 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
2c320 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2c330 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2c340 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
2c350 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
2c360 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c370 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
2c380 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
2c390 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
2c3a0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
2c3b0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
2c3c0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
2c3d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
2c3e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2c3f0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
2c400 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
2c410 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
2c420 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
2c430 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2c440 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2c450 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2c460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c470 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2c480 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2c490 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
2c4a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2c4b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
2c4c0 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
2c4d0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c4e0 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
2c4f0 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
2c500 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c510 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2c520 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
2c530 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
2c540 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
2c550 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
2c560 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
2c570 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
2c580 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
2c590 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
2c5a0 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
2c5b0 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
2c5c0 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
2c5d0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
2c5e0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
2c5f0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c600 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
2c610 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
2c620 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
2c630 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c640 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
2c650 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2c660 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2c670 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c680 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
2c690 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2c6a0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2c6b0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2c6c0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2c6d0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2c6e0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
2c6f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
2c700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c720 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
2c730 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
2c740 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2c750 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
2c760 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2c770 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
2c780 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2c790 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
2c7a0 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
2c7b0 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
2c7c0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
2c7d0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2c7e0 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
2c7f0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
2c800 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
2c810 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
2c820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c830 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
2c840 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
2c850 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b  ame + 1 + nUri +
2c860 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2c870 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
2c880 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20  thname + 8 + 2  
2c890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2c8a0 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  Journal */.#ifnd
2c8b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2c8c0 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61  AL.    + nPathna
2c8d0 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20  me + 4 + 2      
2c8e0 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f        /* zWal */
2c8f0 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61  .#endif.  );.  a
2c900 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2c910 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49  E_ALIGNMENT(SQLI
2c920 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f  TE_INT_TO_PTR(jo
2c930 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20  urnalFileSize)) 
2c940 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
2c950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2c960 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2c970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2c980 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2c990 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2c9a0 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2c9b0 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2c9c0 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2c9d0 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2c9e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2c9f0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2ca00 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2ca10 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2ca20 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2ca30 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2ca40 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2ca50 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ca60 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2ca70 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2ca80 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2ca90 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2caa0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2cab0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2cac0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2cad0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2cae0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2caf0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2cb00 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2cb10 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2cb20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2cb30 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2cb40 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2cb50 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2cb60 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2cb70 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2cb80 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2cb90 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2cba0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2cbb0 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2cbc0 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2cbd0 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2cbe0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2cbf0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2cc00 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2cc10 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2cc20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2cc30 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2cc40 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2cc50 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2cc60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2cc70 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2cc80 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2cc90 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2cca0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2ccb0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2ccc0 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2ccd0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2cce0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ccf0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2cd00 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2cd10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2cd20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2cd30 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2cd40 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2cd50 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2cd60 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2cd70 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2cd80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2cd90 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2cda0 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2cdb0 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2cdc0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2cdd0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2cde0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2cdf0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2ce00 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2ce10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2ce20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2ce30 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2ce40 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2ce50 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2ce60 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2ce70 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2ce80 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ce90 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2cea0 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2cec0 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2ced0 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2cee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cef0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2cf00 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2cf10 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2cf20 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2cf30 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2cf40 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2cf50 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2cf60 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2cf70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2cf80 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2cf90 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2cfa0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2cfb0 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2cfc0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2cfd0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2cfe0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2cff0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2d000 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2d010 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d020 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2d030 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2d040 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2d050 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2d060 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2d070 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2d080 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2d090 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2d0a0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2d0b0 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2d0c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2d0d0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2d0e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d0f0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2d100 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2d110 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2d120 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2d130 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d140 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2d150 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d160 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2d170 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2d180 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2d190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2d1a0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2d1b0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2d1c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2d1d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2d1e0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2d1f0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d200 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2d210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d220 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2d230 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2d240 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2d250 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2d260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2d270 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2d280 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2d290 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2d2a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2d2b0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2d2c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2d2d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d2e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2d2f0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2d300 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2d310 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2d320 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2d330 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2d340 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2d350 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d360 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2d370 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2d380 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2d390 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d3a0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2d3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d3c0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2d3d0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2d3e0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2d3f0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2d400 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2d410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d420 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2d430 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2d440 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2d450 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2d460 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2d470 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2d480 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2d490 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2d4a0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d4b0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2d4c0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2d4d0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2d4e0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2d4f0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2d500 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2d510 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2d520 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2d530 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2d540 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2d550 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2d560 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2d570 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2d580 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2d590 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2d5a0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2d5b0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2d5c0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2d5d0 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2d5e0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2d5f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2d600 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2d610 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2d620 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2d630 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2d640 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2d650 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2d660 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2d670 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2d680 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2d690 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2d6a0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2d6b0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2d6c0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2d6d0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2d6e0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2d6f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d700 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2d710 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2d720 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2d730 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2d740 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2d750 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2d760 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2d770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2d780 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2d790 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2d7a0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2d7b0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2d7c0 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2d7d0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2d7e0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2d7f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2d800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d810 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2d820 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2d830 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2d840 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2d850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d860 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2d870 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2d880 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2d890 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2d8a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2d8b0 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2d8c0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2d8d0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2d8e0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2d8f0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2d900 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2d910 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2d920 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2d930 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2d940 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2d950 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2d960 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2d970 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2d980 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2d990 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2d9a0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2d9b0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2d9c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2d9d0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2d9e0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2d9f0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2da00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2da10 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2da20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2da30 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2da40 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2da50 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2da60 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2da70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2da80 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2da90 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2daa0 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2dab0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2dac0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2dad0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2dae0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2daf0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23  GER_UNLOCK; */.#
2db00 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
2db10 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
2db20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
2db30 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
2db40 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23  GER_UNLOCK) );.#
2db50 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
2db60 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2db70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2db80 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2db90 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2dba0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2dbb0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2dbc0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2dbd0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2dbe0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2dbf0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2dc00 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2dc10 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2dc20 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2dc30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2dc40 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2dc50 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2dc60 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2dc70 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2dc80 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2dc90 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2dca0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2dcb0 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2dcc0 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2dcd0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2dce0 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2dcf0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2dd00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2dd10 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2dd20 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2dd30 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2dd40 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2dd50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2dd60 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2dd70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2dd80 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2dd90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2dda0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2ddb0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2ddc0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2ddd0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2dde0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2ddf0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2de00 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2de10 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2de20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2de30 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2de40 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2de50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2de60 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2de70 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2de80 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2de90 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2dea0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2deb0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2dec0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ded0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2dee0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2def0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2df00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2df10 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2df20 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2df30 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2df40 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2df50 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2df60 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2df70 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2df80 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2df90 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2dfa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2dfb0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2dfc0 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2dfd0 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2dfe0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2dff0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2e000 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2e010 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2e020 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2e030 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e040 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2e050 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2e060 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2e070 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2e080 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2e090 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2e0a0 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2e0b0 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  ); */..  *ppPage
2e0c0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2e0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e0e0 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
2e0f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2e100 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2e110 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2e120 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2e130 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2e140 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2e150 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2e160 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2e170 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2e180 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2e190 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2e1a0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2e1b0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2e1c0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2e1d0 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2e1e0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2e1f0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2e200 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2e210 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2e220 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2e230 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2e240 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2e250 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2e260 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2e270 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2e280 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2e290 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2e2a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2e2b0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2e2c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2e2d0 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2e2e0 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2e2f0 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2e300 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2e310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e320 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2e330 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2e340 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2e350 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2e360 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2e370 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2e380 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2e390 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2e3a0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2e3b0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2e3c0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2e3d0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2e3e0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2e3f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2e400 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2e410 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2e420 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2e430 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2e440 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2e450 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2e460 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2e470 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2e480 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2e490 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2e4a0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2e4b0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2e4c0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2e4d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2e4e0 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2e4f0 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2e500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2e510 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2e520 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2e530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2e540 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2e550 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2e560 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2e570 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2e580 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2e590 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2e5a0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2e5b0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2e5c0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2e5d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2e5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2e5f0 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2e600 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2e610 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2e620 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2e630 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2e640 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2e650 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2e660 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2e670 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2e680 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2e690 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2e6a0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2e6b0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2e6c0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2e6d0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2e6e0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2e6f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2e700 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2e710 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2e720 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2e730 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2e740 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2e750 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2e760 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2e770 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2e780 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2e790 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e7a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2e7b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e7c0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2e7d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e7e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2e7f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2e800 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2e810 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2e820 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2e830 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2e840 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2e850 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2e860 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2e870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2e880 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2e890 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2e8a0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2e8b0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2e8c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2e8d0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2e8e0 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2e8f0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2e900 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2e910 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2e920 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2e930 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2e940 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2e950 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2e960 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2e970 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2e980 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2e990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2e9a0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2e9b0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2e9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e9d0 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2e9e0 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2e9f0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2ea00 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2ea10 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2ea20 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2ea30 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2ea40 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2ea50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2ea60 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2ea70 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2ea80 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2ea90 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2eaa0 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2eab0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2eac0 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2ead0 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2eae0 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2eaf0 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2eb00 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2eb10 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2eb20 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2eb30 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2eb40 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2eb50 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2eb60 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2eb70 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2eb80 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2eb90 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2eba0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2ebb0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2ebc0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2ebd0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2ebe0 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2ebf0 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2ec00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2ec10 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2ec20 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2ec30 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2ec40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2ec50 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2ec60 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ec80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ec90 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2eca0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
2ecb0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
2ecc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ecd0 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
2ece0 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
2ecf0 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
2ed00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2ed10 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
2ed20 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
2ed30 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
2ed40 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
2ed50 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
2ed60 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2ed70 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
2ed80 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
2ed90 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
2eda0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
2edb0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
2edc0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
2edd0 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
2ede0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2edf0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2ee00 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2ee10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ee20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
2ee30 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
2ee40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2ee50 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2ee60 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2ee70 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2ee80 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2ee90 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2eea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2eeb0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2eec0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2eed0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2eee0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2eef0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2ef00 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2ef10 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2ef20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2ef30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2ef40 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2ef50 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2ef60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ef70 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2ef80 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2ef90 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2efa0 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2efb0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2efc0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2efd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2efe0 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2eff0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2f000 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2f010 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2f020 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2f030 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2f040 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2f050 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2f060 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2f070 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2f080 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2f090 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2f0a0 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2f0b0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2f0c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2f0d0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2f0e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2f0f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2f100 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2f110 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2f120 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f130 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2f140 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f150 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2f160 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2f170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2f1a0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2f1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f1c0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2f1d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2f1e0 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2f1f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2f200 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2f210 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2f220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f240 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f250 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2f260 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2f270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f280 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2f290 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2f2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f2b0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2f2c0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2f2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2f2e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2f2f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2f300 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2f310 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2f320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2f330 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2f340 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f350 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2f360 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2f370 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2f380 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2f390 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2f3a0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2f3b0 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2f3c0 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
2f3d0 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
2f3e0 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
2f3f0 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
2f400 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
2f410 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
2f420 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2f430 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
2f440 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
2f450 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
2f460 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2f470 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2f480 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
2f490 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
2f4a0 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
2f4b0 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
2f4c0 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
2f4d0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
2f4e0 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
2f4f0 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
2f500 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
2f510 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
2f520 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
2f530 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2f540 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2f550 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
2f560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f570 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2f580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2f5a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f5b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f5c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
2f5d0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
2f5e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2f5f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
2f600 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
2f610 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
2f620 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
2f630 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2f640 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
2f650 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
2f660 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
2f670 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
2f680 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
2f690 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f6a0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2f6b0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
2f6c0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2f6d0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
2f6e0 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
2f6f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
2f700 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
2f710 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
2f720 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
2f730 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
2f740 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
2f750 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
2f760 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2f770 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2f780 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
2f790 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f7a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
2f7b0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
2f7c0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
2f7d0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
2f7e0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2f7f0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
2f800 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
2f810 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
2f820 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
2f830 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
2f840 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
2f850 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
2f860 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
2f870 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
2f880 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
2f890 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
2f8a0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
2f8b0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
2f8c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f8d0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
2f8e0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
2f8f0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
2f900 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
2f910 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
2f920 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2f930 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2f940 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
2f950 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
2f960 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
2f970 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
2f980 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
2f990 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2f9a0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
2f9b0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2f9c0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
2f9d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2f9e0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
2f9f0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
2fa00 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2fa10 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
2fa20 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
2fa30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
2fa40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
2fa50 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2fa60 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
2fa70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2fa80 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
2fa90 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2faa0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
2fab0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
2fac0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2fad0 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
2fae0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
2faf0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
2fb00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2fb10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2fb20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2fb30 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
2fb40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2fb50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2fb70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2fb80 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2fb90 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2fba0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
2fbb0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
2fbc0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
2fbd0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
2fbe0 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
2fbf0 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
2fc00 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
2fc10 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
2fc20 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
2fc30 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2fc40 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
2fc50 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
2fc60 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
2fc70 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
2fc80 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
2fc90 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2fca0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
2fcb0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2fcc0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2fcd0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2fce0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2fcf0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
2fd00 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2fd10 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2fd20 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
2fd30 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
2fd40 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
2fd50 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2fd60 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
2fd70 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2fd80 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
2fd90 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2fda0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
2fdb0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
2fdc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2fdd0 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
2fde0 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
2fdf0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2fe00 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63  MEMDB );..    rc
2fe10 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2fe20 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
2fe30 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2fe40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fe50 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2fe60 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2fe70 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
2fe80 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
2fe90 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
2fea0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2feb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2fec0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2fed0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2fee0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2fef0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2ff00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2ff10 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2ff20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2ff30 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2ff40 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2ff50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2ff60 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2ff70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2ff80 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2ff90 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2ffa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ffb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ffc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2ffd0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2ffe0 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2fff0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30000 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
30010 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30020 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
30030 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
30040 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30050 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
30060 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
30070 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30080 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
30090 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
300a0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
300b0 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
300c0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
300d0 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
300e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
300f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
30100 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
30110 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
30120 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
30130 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30140 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
30150 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
30160 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
30170 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
30180 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
30190 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
301a0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
301b0 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
301c0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
301d0 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
301e0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
301f0 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
30200 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
30210 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
30220 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
30230 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
30240 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
30250 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
30260 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
30270 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
30280 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
30290 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
302a0 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
302b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
302c0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
302d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
302e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
302f0 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
30300 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
30310 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
30320 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
30330 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
30340 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
30350 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
30360 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
30370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30380 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
30390 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
303a0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
303b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
303c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
303d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
303e0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
303f0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
30400 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
30410 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
30420 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
30430 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
30440 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
30450 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
30460 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
30470 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
30480 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
30490 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
304a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
304b0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
304c0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
304d0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
304e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
304f0 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
30500 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
30510 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
30520 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
30530 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
30540 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
30550 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
30560 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
30570 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
30580 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
30590 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
305a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
305b0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
305c0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
305d0 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
305e0 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
305f0 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
30600 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
30610 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
30620 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
30630 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
30640 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
30650 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
30660 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
30670 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
30680 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
30690 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
306a0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
306b0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
306c0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
306d0 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
306e0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
306f0 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
30700 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
30710 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
30720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30730 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
30740 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
30750 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
30760 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
30770 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30790 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
307a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
307b0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
307c0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
307d0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
307e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
307f0 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
30800 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30810 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
30820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
30830 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
30840 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
30850 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
30860 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
30870 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
30880 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
30890 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
308a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
308b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
308c0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
308d0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
308e0 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
308f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
30900 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
30910 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
30920 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
30930 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30940 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
30950 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
30960 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
30970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30980 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
30990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
309a0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
309b0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
309c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
309d0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
309e0 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
309f0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
30a00 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
30a10 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
30a20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
30a30 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
30a40 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
30a50 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
30a60 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
30a70 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
30a80 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
30a90 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
30aa0 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
30ab0 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
30ac0 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
30ad0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
30ae0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
30af0 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
30b00 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
30b10 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
30b20 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
30b30 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
30b40 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
30b50 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
30b60 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
30b70 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
30b80 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
30b90 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
30ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
30bb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
30bc0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
30bd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
30be0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
30bf0 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
30c00 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
30c10 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
30c20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30c30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30c40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
30c50 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
30c60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
30c70 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
30c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30c90 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
30ca0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
30cb0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
30cc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
30cd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30ce0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
30d10 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
30d20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
30d30 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
30d40 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
30d50 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
30d60 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
30d70 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
30d80 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
30d90 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
30da0 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
30db0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
30dc0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
30dd0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
30de0 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
30df0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
30e00 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
30e10 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
30e20 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
30e30 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
30e40 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
30e50 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
30e60 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
30e70 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
30e80 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
30e90 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
30ea0 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
30eb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30ec0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
30ed0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
30ee0 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
30ef0 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
30f00 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
30f10 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
30f20 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
30f30 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
30f40 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
30f50 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
30f60 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
30f70 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
30f80 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
30f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
30fa0 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
30fb0 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
30fc0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
30fd0 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
30fe0 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
30ff0 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31000 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31010 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31020 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31030 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31040 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31050 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31060 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31070 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31080 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31090 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
310a0 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
310b0 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
310c0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
310d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
310e0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
310f0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
31100 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31110 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31130 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31150 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
31160 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
31170 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
31180 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31190 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
311a0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
311b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
311c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
311d0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a  ->tempFile && (.
311e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
311f0 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c  pBackup .     ||
31200 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
31210 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
31220 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
31230 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 4d 61 70   || pPager->pMap
31240 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
31250 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
31260 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
31270 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
31280 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
31290 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
312a0 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
312b0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
312c0 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
312d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
312e0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
312f0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
31300 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
31310 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
31320 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
31330 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
31340 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
31350 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
31360 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
31370 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
31380 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
31390 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
313a0 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
313b0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
313c0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
313d0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
313e0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
313f0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
31400 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
31410 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
31420 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
31430 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
31440 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
31450 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
31460 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
31470 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
31480 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
31490 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
314a0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
314b0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
314c0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
314d0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
314e0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
314f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
31500 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
31510 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
31520 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
31530 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
31540 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
31550 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
31560 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  /.      Pgno nPa
31570 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
31580 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
31590 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
315a0 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
315b0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
315c0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
315d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
315e0 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65   rc ) goto faile
315f0 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50  d;..      if( nP
31600 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
31610 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
31620 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
31630 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
31640 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
31650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31660 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
31670 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
31680 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
31690 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
316a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
316b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
316c0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
316d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
316e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
316f0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
31700 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
31710 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
31720 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
31730 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
31740 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
31750 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
31760 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
31770 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
31780 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
31790 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
317a0 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
317b0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
317c0 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
317d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
317e0 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
317f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31800 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
31810 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
31820 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
31830 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
31840 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
31850 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
31860 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
31870 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
31880 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
31890 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
318a0 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
318b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
318c0 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
318d0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
318e0 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
318f0 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
31900 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
31910 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
31920 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
31930 20 20 20 70 61 67 65 72 55 6e 6d 61 70 28 70 50     pagerUnmap(pP
31940 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ager);.      }el
31950 73 65 20 69 66 28 20 28 28 69 36 34 29 6e 50 61  se if( ((i64)nPa
31960 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
31970 69 7a 65 29 21 3d 70 50 61 67 65 72 2d 3e 6e 4d  ize)!=pPager->nM
31980 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  ap ){.        pa
31990 67 65 72 55 6e 6d 61 70 28 70 50 61 67 65 72 29  gerUnmap(pPager)
319a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
319b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
319c0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
319d0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
319e0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
319f0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
31a00 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
31a10 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
31a20 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
31a30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
31a40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
31a50 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
31a60 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
31a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31a80 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
31a90 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
31aa0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
31ab0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
31ac0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
31ad0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
31ae0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31af0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
31b00 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
31b10 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
31b20 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
31b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31b40 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
31b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31b60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
31b70 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
31b80 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
31b90 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
31ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
31bc0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
31bd0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
31be0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
31bf0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31c00 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
31c10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
31c20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31c30 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
31c40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31c50 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
31c60 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
31c70 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
31c80 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
31c90 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
31ca0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
31cb0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
31cc0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
31cd0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
31ce0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
31cf0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
31d00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
31d10 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
31d20 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
31d30 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
31d40 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
31d50 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
31d60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
31d70 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
31d80 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
31d90 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
31da0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
31db0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
31dc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
31dd0 63 68 65 29 3d 3d 30 29 20 26 26 20 70 50 61 67  che)==0) && pPag
31de0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
31df0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
31e00 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
31e10 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
31e20 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
31e30 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
31e40 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
31e50 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
31e60 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
31e70 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
31e80 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
31e90 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
31ea0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
31eb0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
31ec0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
31ed0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
31ee0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
31ef0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
31f00 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
31f10 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
31f20 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
31f30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
31f40 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
31f50 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
31f60 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
31f70 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
31f80 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
31f90 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
31fa0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
31fb0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
31fc0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
31fd0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
31fe0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
31ff0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
32000 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
32010 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
32020 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
32030 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
32040 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
32050 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
32060 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
32070 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
32080 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
32090 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
320a0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
320b0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
320c0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
320d0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
320e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
320f0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
32100 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
32110 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
32120 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
32130 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
32140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
32150 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
32160 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
32170 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
32180 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
32190 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
321a0 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
321b0 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
321c0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
321d0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
321e0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
321f0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
32200 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
32210 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
32220 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
32230 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
32240 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
32250 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
32260 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
32270 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
32280 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
32290 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
322a0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
322b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
322c0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
322d0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
322e0 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
322f0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
32300 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
32310 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
32320 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
32330 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
32340 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
32350 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
32360 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
32370 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
32380 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
32390 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
323a0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
323b0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
323c0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
323d0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
323e0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
323f0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
32400 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
32410 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
32420 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
32430 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
32440 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
32450 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
32460 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
32470 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
32480 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
32490 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
324a0 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
324b0 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
324c0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
324d0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
324e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
324f0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
32500 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
32510 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
32520 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
32530 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
32540 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
32550 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
32560 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
32570 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32580 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
32590 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
325a0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
325b0 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
325c0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
325d0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
325e0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
325f0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
32600 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
32610 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
32620 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
32630 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
32640 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
32650 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
32660 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
32670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
32680 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
32690 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
326a0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
326b0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
326c0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
326d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
326e0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
326f0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
32700 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
32710 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
32720 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
32730 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
32740 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
32750 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
32760 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
32770 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
32780 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
32790 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
327a0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
327b0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
327c0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
327d0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
327e0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
327f0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
32800 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
32810 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
32820 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
32830 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
32840 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32850 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
32860 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
32870 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
32880 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32890 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
328a0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
328b0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
328c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
328d0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
328e0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
328f0 20 20 20 2f 2a 20 50 41 47 45 52 5f 41 43 51 55     /* PAGER_ACQU
32900 49 52 45 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  IRE_XXX flags */
32910 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
32920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
32930 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 63 6f  r *pPg = 0;.  co
32940 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
32950 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
32960 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f 4e  ER_ACQUIRE_NOCON
32970 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  TENT);..  /* It 
32980 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
32990 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
329a0 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
329b0 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
329c0 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
329d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
329e0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
329f0 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
32a00 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
32a10 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
32a20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
32a30 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
32a40 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
32a50 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
32a60 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
32a70 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
32a80 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
32a90 3d 20 28 0a 20 20 20 20 20 20 28 70 67 6e 6f 21  = (.      (pgno!
32aa0 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 70 57  =1 && pPager->pW
32ab0 61 6c 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  al==0 && !pPager
32ac0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 21 4d  ->tempFile && !M
32ad0 45 4d 44 42 29 0a 20 20 20 26 26 20 28 70 50 61  EMDB).   && (pPa
32ae0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32af0 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
32b00 61 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55  ags & PAGER_ACQU
32b10 49 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20  IRE_READONLY)). 
32b20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
32b30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
32b40 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
32b50 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32b60 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32b70 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
32b80 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
32b90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
32ba0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
32bb0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
32bc0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
32bd0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
32be0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
32bf0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
32c00 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
32c10 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
32c20 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
32c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
32c40 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
32c50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
32c60 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
32c70 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 69 66 28 20  }else{..    if( 
32c80 62 4d 6d 61 70 4f 6b 20 29 7b 0a 20 20 20 20 20  bMmapOk ){.     
32c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 61   if( pPager->pMa
32ca0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
32cb0 72 63 20 3d 20 70 61 67 65 72 4d 61 70 28 70 50  rc = pagerMap(pP
32cc0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
32cd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32ce0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
32cf0 2d 3e 6e 4d 61 70 3e 3d 28 28 69 36 34 29 70 67  ->nMap>=((i64)pg
32d00 6e 6f 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  no * pPager->pag
32d10 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
32d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32d30 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45  tate>PAGER_READE
32d40 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28  R ){.          (
32d50 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63  void)sqlite3Pcac
32d60 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
32d70 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
32d80 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
32d90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
32da0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
32db0 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
32dc0 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
32dd0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b  er, pgno, &pPg);
32de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32df0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
32e00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32e20 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
32e30 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
32e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32e50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
32e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32e80 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
32e90 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
32ea0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
32eb0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
32ec0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
32ed0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
32ee0 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
32ef0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
32f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32f10 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
32f20 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
32f30 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
32f40 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
32f50 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
32f60 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
32f70 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
32f80 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
32f90 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
32fa0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
32fb0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
32fc0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
32fd0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
32fe0 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
32ff0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33000 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
33010 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
33020 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
33030 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
33040 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
33050 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
33060 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
33070 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33080 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
33090 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
330a0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
330b0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
330c0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
330d0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
330e0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
330f0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
33100 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
33110 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
33120 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
33130 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
33140 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
33150 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
33160 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
33170 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
33180 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
33190 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
331a0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
331b0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
331c0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
331d0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
331e0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
331f0 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
33200 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
33210 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
33220 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
33230 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
33240 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
33250 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33260 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
33270 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
33280 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
33290 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
332a0 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
332b0 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
332c0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
332d0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
332e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
332f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
33300 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33310 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
33320 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33330 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
33340 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
33350 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
33360 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
33370 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
33380 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
33390 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
333a0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
333b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
333c0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
333d0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
333e0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
333f0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
33400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
33410 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
33420 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
33430 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
33440 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
33450 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
33460 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
33470 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
33480 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
33490 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
334a0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
334b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
334c0 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
334d0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
334e0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
334f0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
33500 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
33510 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33520 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
33530 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
33540 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
33550 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
33560 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
33570 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
33580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
33590 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
335a0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
335b0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
335c0 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
335d0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
335e0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
335f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
33600 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
33610 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
33620 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
33630 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
33640 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
33650 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
33660 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
33670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
33680 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
33690 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
336a0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
336b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
336c0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
336d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
336e0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
336f0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
33700 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
33710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
33720 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
33730 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
33740 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
33750 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
33760 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
33770 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
33780 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
337a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
337b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
337c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
337d0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
337e0 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
337f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33800 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
33810 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
33820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
33830 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
33840 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
33850 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
33860 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
33870 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
33880 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
33890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
338a0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
338b0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
338c0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
338d0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
338e0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
338f0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
33900 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
33910 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
33920 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
33930 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
33940 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
33950 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
33960 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
33970 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
33980 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
33990 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
339a0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
339b0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
339c0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
339d0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
339e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
339f0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
33a00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
33a10 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
33a20 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
33a30 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
33a40 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
33a50 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
33a60 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
33a70 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
33a80 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
33a90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
33aa0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
33ab0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
33ac0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
33ad0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
33ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33af0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
33b00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33b10 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
33b20 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
33b30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
33b40 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
33b50 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33b60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33b70 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
33b80 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
33b90 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
33ba0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
33bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
33bc0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
33bd0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
33be0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
33bf0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
33c00 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
33c10 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
33c20 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
33c30 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
33c40 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
33c50 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
33c60 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
33c70 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
33c80 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
33c90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
33ca0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
33cb0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
33cc0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
33cd0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
33ce0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
33cf0 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
33d00 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 52 65  ){.      pagerRe
33d10 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
33d20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33d30 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
33d40 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
33d50 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
33d60 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
33d70 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
33d80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33d90 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
33da0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
33db0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
33dc0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
33dd0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
33de0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
33df0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
33e00 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
33e10 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
33e20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
33e30 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
33e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
33e50 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
33e60 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
33e70 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
33e80 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
33e90 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
33ea0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
33eb0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
33ec0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
33ed0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
33ee0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
33ef0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33f00 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
33f10 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
33f20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
33f30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
33f40 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
33f50 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
33f60 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
33f70 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
33f80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
33f90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
33fa0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
33fb0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
33fc0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
33fd0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
33fe0 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
33ff0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
34000 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
34010 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
34020 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
34030 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
34040 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
34050 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
34060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
34070 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
34080 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
34090 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
340a0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
340b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
340c0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
340d0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
340e0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
340f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
34100 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
34110 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
34120 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
34130 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
34140 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
34150 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
34160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34170 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
34180 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
34190 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
341a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
341b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
341c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
341e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
341f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
34200 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
34210 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
34220 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
34230 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
34240 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34250 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
34260 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
34270 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
34280 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
34290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
342a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
342b0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
342c0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
342d0 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
342e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
342f0 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
34300 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
34310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
34320 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
34330 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
34340 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
34350 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
34360 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
34370 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
34380 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
34390 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
343a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
343b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
343c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
343d0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
343e0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
343f0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
34400 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
34410 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
34420 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
34430 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
34440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
34460 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
34470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
34480 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
34490 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
344a0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
344b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
344c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
344d0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
344e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
344f0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
34500 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
34510 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34520 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34530 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
34540 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
34550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
34560 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
34570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
34580 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
34590 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
345a0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
345b0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
345c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
345d0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
345e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
345f0 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
34600 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
34610 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
34620 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
34630 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
34640 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64         );.  #ifd
34650 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
34660 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
34670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34680 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
34690 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
346a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
346b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
346c0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
346d0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
346e0 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65        );.  #else
346f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34700 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
34710 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
34720 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
34730 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65   flags, 0);.  #e
34740 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
34750 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
34760 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
34770 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
34780 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
34790 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
347a0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
347b0 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
347c0 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
347d0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
347e0 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
347f0 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
34800 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
34820 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
34830 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
34840 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
34850 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
34860 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
34870 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
34880 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
34890 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
348a0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
348b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
348c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
348d0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
348e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
348f0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
34900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34910 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
34920 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
34930 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
34940 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34950 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
34960 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34970 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34980 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
34990 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
349a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
349b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
349c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
349d0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
349e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
349f0 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
34a00 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
34a10 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
34a20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
34a30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
34a40 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
34a50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
34a60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
34a70 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
34a80 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
34a90 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
34aa0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
34ab0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34ac0 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
34ad0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
34ae0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
34af0 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
34b00 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
34b10 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
34b20 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
34b30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
34b40 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
34b50 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
34b60 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
34b70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
34b80 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
34b90 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
34ba0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
34bb0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
34bc0 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
34bd0 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
34be0 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
34bf0 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
34c00 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
34c10 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
34c20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
34c30 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
34c40 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
34c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
34c60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
34c70 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
34c80 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
34c90 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
34ca0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
34cb0 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
34cc0 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
34cd0 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
34ce0 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
34cf0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
34d00 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
34d10 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
34d20 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
34d30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
34d40 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
34d50 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
34d60 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
34d70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
34d80 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
34d90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
34da0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
34db0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
34dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34dd0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
34de0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
34df0 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
34e00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
34e10 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
34e20 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
34e30 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
34e40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34e50 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
34e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34e70 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
34e80 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
34e90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34ea0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
34eb0 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
34ec0 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
34ed0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
34ee0 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
34ef0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
34f00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
34f10 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
34f20 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
34f30 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
34f40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34f50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
34f60 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
34f70 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
34f80 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
34f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
34fa0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
34fb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
34fc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34fd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34fe0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34ff0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
35000 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
35010 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
35020 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
35030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35040 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
35050 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
35060 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
35070 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
35080 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
35090 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
350a0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
350b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
350c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
350d0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
350e0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
350f0 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
35100 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
35110 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
35120 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
35130 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
35140 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
35150 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
35160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35170 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
35180 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
35190 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
351a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
351b0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
351c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
351d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
351e0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
351f0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
35200 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
35210 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
35220 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
35230 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35240 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
35250 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
35260 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
35270 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
35280 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
35290 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
352a0 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
352b0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
352c0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
352d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
352e0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
352f0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
35300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
35320 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
35330 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
35340 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
35350 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
35360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35390 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
353a0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
353b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
353c0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
353d0 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
353e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
353f0 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
35400 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
35410 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
35420 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
35430 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
35440 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
35450 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
35460 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
35470 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
35480 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
35490 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
354a0 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
354b0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
354c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
354d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
354e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
354f0 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
35500 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
35510 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
35520 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
35530 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
35540 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
35550 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
35560 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35570 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
35580 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
35590 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
355a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
355b0 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
355c0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
355d0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
355e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
355f0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
35600 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
35610 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
35620 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
35630 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
35640 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
35650 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
35660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35670 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35680 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35690 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
356a0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
356b0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
356c0 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
356d0 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
356e0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
356f0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
35700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35710 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
35720 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
35730 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
35740 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
35750 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
35760 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
35770 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
35780 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
35790 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
357a0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
357b0 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
357c0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
357d0 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
357e0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
357f0 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
35800 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
35810 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
35820 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
35830 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
35840 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
35850 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35860 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
35870 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
35880 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
35890 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
358a0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
358b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
358c0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
358d0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
358e0 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
358f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
35900 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
35910 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
35920 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
35930 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
35940 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
35950 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
35960 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
35970 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
35980 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
35990 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
359a0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
359b0 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
359c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
359d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
359e0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
359f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
35a00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
35a10 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
35a20 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35a30 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35a40 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
35a50 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
35a60 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
35a70 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d  , report the sam
35a80 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61  e error.  ** aga
35a90 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  in. This should 
35aa0 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20  not happen, but 
35ab0 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64  the check provid
35ac0 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  es robustness. *
35ad0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
35ae0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
35af0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
35b00 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
35b10 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
35b20 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
35b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35b40 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
35b50 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
35b60 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
35b70 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
35b80 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
35b90 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35ba0 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
35bb0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35bc0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
35bd0 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
35be0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
35bf0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
35c00 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
35c10 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
35c20 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
35c30 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
35c40 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
35c50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35c60 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
35c70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
35c80 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
35c90 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
35ca0 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
35cb0 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
35cc0 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
35cd0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
35ce0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
35cf0 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
35d00 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
35d10 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
35d20 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
35d30 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
35d40 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
35d50 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
35d60 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
35d70 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
35d80 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
35d90 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
35da0 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
35db0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
35dc0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
35dd0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
35de0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35df0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
35e00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
35e10 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
35e20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
35e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
35e40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
35e50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35e60 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
35e70 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
35e80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
35e90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
35ea0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
35eb0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
35ec0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
35ed0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
35ee0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
35ef0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
35f00 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
35f10 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
35f20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
35f30 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
35f40 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
35f50 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
35f60 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
35f70 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  pPg) ){.    asse
35f80 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
35f90 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65  (pPager) );.  }e
35fa0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  lse{.  .    /* T
35fb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
35fc0 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
35fd0 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
35fe0 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
35ff0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
36000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
36010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36020 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
36030 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
36040 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
36050 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
36060 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
36070 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
36080 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
36090 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67  nal(pPg) && !pag
360a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
360b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
360c0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
360d0 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
360e0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
360f0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
36100 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ize && isOpen(pP
36110 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
36120 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
36130 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
36140 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69  Data2;.        i
36150 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
36160 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
36170 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
36180 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
36190 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
361a0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
361b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
361c0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
361d0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
361e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
361f0 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
36200 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
36210 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
36220 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
36230 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
36240 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
36250 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
36270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36280 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ff );.        CO
36290 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
362a0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
362b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
362c0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
362d0 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
362e0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
362f0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
36300 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
36310 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
36320 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
36330 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
36340 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
36350 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
36360 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
36370 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
36380 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
36390 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
363a0 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
363b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
363c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
363d0 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
363e0 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
363f0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
36400 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
36410 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
36420 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
36430 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
36440 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
36450 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
36460 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
36470 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
36480 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
36490 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
364a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
364b0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
364c0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
364d0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
364e0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
364f0 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
36500 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
36510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36520 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36530 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36540 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
36550 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
36560 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
36570 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20  iOff+4);.       
36580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36590 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
365a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
365b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
365c0 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
365d0 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
365e0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  ksum);.        i
365f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36600 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
36610 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
36620 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
36630 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
36640 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
36650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
36660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
36670 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
36680 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
36690 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
366a0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
366b0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
366c0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
366d0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
366e0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
366f0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
36700 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
36710 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
36720 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
36730 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
36740 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
36750 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
36760 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
36770 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36780 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
36790 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
367a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
367b0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
367c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
367d0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
367e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
367f0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
36800 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36810 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
36820 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36830 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
36840 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
36850 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
36860 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
36870 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
36880 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
36890 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
368a0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
368b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
368c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
368d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
368e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
368f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
36900 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36910 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
36920 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
36930 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
36940 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
36950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
36960 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
36970 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
36980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
36990 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
369a0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
369b0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
369c0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
369d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
369e0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
369f0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
36a00 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
36a10 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
36a20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
36a30 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
36a40 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
36a50 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
36a60 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
36a70 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
36a80 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
36a90 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
36aa0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
36ab0 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
36ac0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
36ad0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
36ae0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
36af0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
36b00 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
36b10 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
36b20 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
36b30 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
36b40 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
36b50 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
36b60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
36b70 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
36b80 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
36b90 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
36ba0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
36bb0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
36bc0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
36bd0 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
36be0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
36bf0 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
36c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
36c20 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
36c30 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
36c40 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
36c50 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
36c60 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
36c70 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
36c80 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
36c90 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
36ca0 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
36cb0 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
36cc0 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
36cd0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
36ce0 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
36cf0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
36d00 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
36d10 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
36d20 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
36d30 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
36d40 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
36d50 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
36d60 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
36d70 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
36d80 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
36d90 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
36da0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
36db0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
36dc0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
36dd0 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
36de0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
36df0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
36e00 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
36e10 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
36e20 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
36e30 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
36e40 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
36e50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
36e60 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
36e70 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
36e80 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
36e90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
36ea0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
36eb0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
36ec0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
36ed0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
36ee0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
36ef0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36f00 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
36f10 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
36f20 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
36f30 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
36f40 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  e);..  assert( (
36f50 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
36f60 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20  DR_MMAP)==0 );. 
36f70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36f80 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
36f90 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
36fa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36fb0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
36fc0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
36fd0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36fe0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36ff0 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
37000 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
37010 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
37020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
37030 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
37040 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
37050 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
37060 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
37070 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
37080 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
37090 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
370a0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
370b0 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
370c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
370d0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
370e0 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
370f0 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
37100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37110 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
37120 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
37130 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
37140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
37150 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
37160 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
37170 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
37180 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
37190 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
371a0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
371b0 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
371c0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
371d0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
371e0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
371f0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
37200 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
37210 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
37220 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
37230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
37240 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
37250 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pill==0 );.    p
37260 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
37270 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  Spill++;..    /*
37280 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
37290 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
372a0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
372b0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
372c0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
372d0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
372e0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
372f0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
37300 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
37310 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
37320 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
37330 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
37340 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
37350 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
37360 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
37370 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
37380 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
37390 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
373a0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
373b0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
373c0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
373d0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
373e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
373f0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
37400 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
37410 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
37420 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
37430 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
37440 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
37450 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
37460 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
37470 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
37480 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
37490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
374a0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
374b0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
374c0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
374d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
374e0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
374f0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
37500 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
37510 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
37520 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
37530 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
37540 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37550 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
37560 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
37570 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
37590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
375a0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
375b0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
375c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
375d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
375e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
375f0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
37600 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
37610 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
37620 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
37630 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
37640 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
37650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
37660 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
37670 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
37680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37690 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
376a0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
376b0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
376c0 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
376d0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
376e0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
376f0 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
37700 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
37710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37720 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
37730 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
37740 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
37750 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
37760 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
37770 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
37780 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
37790 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
377a0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
377b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
377c0 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
377d0 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
377e0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
377f0 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
37800 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
37810 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
37820 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
37830 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
37840 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
37850 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
37860 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
37870 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
37880 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
37890 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
378a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
378b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
378c0 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
378d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
378e0 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  MDB );.      for
378f0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
37900 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
37910 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
37920 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
37930 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
37940 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
37950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
37960 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
37970 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
37980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37990 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
379a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
379b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
379c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
379d0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20  NotSyncSpill==1 
379e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
379f0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b  oNotSyncSpill--;
37a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
37a10 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
37a20 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
37a30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37a40 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
37a50 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
37a60 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
37a70 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
37a80 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
37a90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
37aa0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
37ab0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
37ac0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
37ad0 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
37ae0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
37af0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
37b00 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
37b10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
37b20 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
37b30 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
37b40 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
37b50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
37b60 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
37b70 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
37b80 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
37b90 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
37ba0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
37bb0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
37bc0 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
37bd0 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
37be0 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
37bf0 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
37c00 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
37c10 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
37c20 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
37c30 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
37c40 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
37c50 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
37c60 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
37c70 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
37c80 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
37c90 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
37ca0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
37cb0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
37cc0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
37cd0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
37ce0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
37cf0 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
37d00 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
37d10 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
37d20 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
37d30 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
37d40 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
37d50 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
37d60 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
37d70 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
37d80 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
37d90 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
37da0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
37db0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
37dc0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
37dd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
37de0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
37df0 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
37e00 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
37e10 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
37e20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
37e30 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
37e40 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
37e50 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
37e60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
37e70 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
37e80 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
37e90 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
37ea0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
37eb0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
37ec0 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61  NT_WRITE;.    pa
37ed0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
37ee0 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
37ef0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37f00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
37f10 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
37f20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
37f30 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
37f40 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
37f50 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
37f60 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
37f70 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
37f80 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
37f90 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
37fa0 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72  e.  The secondar
37fb0 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  y change counter
37fc0 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73   at.** 92 is als
37fd0 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69 73  o updated, as is
37fe0 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
37ff0 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
38000 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42  fset 96..**.** B
38010 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70  ut this only hap
38020 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61 67  pens if the pPag
38030 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
38040 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73  one flag is fals
38050 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65  e..** To avoid e
38060 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f  xcess churning o
38070 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75 70  f page 1, the up
38080 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e  date only happen
38090 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61  s once..** See a
380a0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72  lso the pager_wr
380b0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
380c0 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74  r() routine that
380d0 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63   does an .** unc
380e0 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
380f0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
38100 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  counters..**.** 
38110 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
38120 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
38130 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
38140 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
38150 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
38160 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
38170 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
38180 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
38190 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
381a0 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
381b0 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
381c0 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
381d0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
381e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
381f0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
38200 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
38210 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
38220 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
38230 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
38240 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
38250 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
38260 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
38270 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
38280 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
38290 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
382a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
382b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
382c0 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
382d0 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
382e0 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
382f0 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
38300 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
38310 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
38320 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
38330 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
38340 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
38350 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
38360 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
38370 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
38380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
38390 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
383a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
383b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
383c0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
383d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
383e0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
383f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
38400 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
38410 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63  er) );..  /* Dec
38420 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
38430 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
38440 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
38450 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
38460 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
38470 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
38480 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
38490 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
384a0 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
384b0 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
384c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
384d0 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
384e0 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
384f0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
38500 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
38510 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
38520 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
38530 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
38540 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
38550 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
38560 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
38570 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
38580 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
38590 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
385a0 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
385b0 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
385c0 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
385d0 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
385e0 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
385f0 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
38600 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
38610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
38620 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69  MIC_WRITE.# defi
38630 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30  ne DIRECT_MODE 0
38640 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
38650 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ectMode==0 );.  
38660 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
38670 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a  (isDirectMode);.
38680 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
38690 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72  IRECT_MODE isDir
386a0 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a  ectMode.#endif..
386b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
386c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
386d0 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  & ALWAYS(pPager-
386e0 3e 64 62 53 69 7a 65 3e 30 29 20 29 7b 0a 20 20  >dbSize>0) ){.  
386f0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
38700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38710 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
38720 70 61 67 65 20 31 20 2a 2f 0a 0