/ Hex Artifact Content
Login

Artifact 0abcb0904a78d68b96357f360c6b160bcfc2a3e0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 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 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 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 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 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 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
78f0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7910: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7920: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7930: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7950: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7960: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7970: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7980: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
79a0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
79c0: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
79f0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a00: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7a10: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7a20: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7a30: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7a40: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7a50: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7a70: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7a80: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7a90: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7aa0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7ac0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7ad0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7ae0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7af0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7b10: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7b20: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7b30: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7b40: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7b50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7b60: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7b70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7b80: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7b90: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7ba0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7bb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7bc0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7bd0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7be0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7bf0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c00: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7c10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7c20: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7c30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c40: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7c60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7c70: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7c80: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7c90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7ca0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7cc0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7cd0: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7ce0: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7cf0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d00: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7d10: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7d20: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7d30: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7d40: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7d50: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7d60: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7d70: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7d80: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7db0: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7dc0: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
7dd0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
7de0: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7df0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
7e00: 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 75 38 20  hanges */..  u8 
7e10: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7e30: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f   */.  int nMmapO
7e50: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
7e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7e70: 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65 6e  map pages curren
7e80: 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
7e90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
7ea0: 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20  64 szMmap;      
7eb0: 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69   /* Desired maxi
7ec0: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f  mum mmap size */
7ed0: 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46  .  PgHdr *pMmapF
7ee0: 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f  reelist;       /
7ef0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d  * List of free m
7f00: 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72 73  map page headers
7f10: 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f   (pDirty) */.  /
7f20: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7f30: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7f40: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7f50: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fa0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7fd0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7fe0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7ff0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
8000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8020: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
8030: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
8040: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8060: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
8070: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8080: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
8090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80a0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
80b0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
80c0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
80d0: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
8100: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
8110: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
8120: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
8130: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
8140: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
8150: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8160: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
8170: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
8180: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
8190: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
81a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
81c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
81d0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
81e0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8200: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
8210: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
8220: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
8230: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
8240: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
8250: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
8260: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8270: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8280: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8290: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
82a0: 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20  int aStat[3];   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
82c0: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c  otal cache hits,
82d0: 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74   misses and writ
82e0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
82f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
8300: 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
8310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8320: 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f  se pages read */
8330: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8340: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8350: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8360: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8370: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8380: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8390: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
83a0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
83b0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
83c0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
83d0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
83e0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
83f0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8400: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8410: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8420: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8430: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8440: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8460: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8470: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8480: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8490: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
84a0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
84b0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
84c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
84d0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
84e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
84f0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8500: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8510: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8520: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8530: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8540: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8550: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8570: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8590: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
85a0: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
85b0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
85c0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
85f0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8600: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8610: 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73  * Indexes for us
8620: 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74  e with Pager.aSt
8630: 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e  at[]. The Pager.
8640: 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f  aStat[] array co
8650: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
8660: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
8670: 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f   passing SQLITE_
8680: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
8690: 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a  IT, CACHE_MISS .
86a0: 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54  ** or CACHE_WRIT
86b0: 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f  E to sqlite3_db_
86c0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65  status()..*/.#de
86d0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
86e0: 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20  HIT   0.#define 
86f0: 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20  PAGER_STAT_MISS 
8700: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
8710: 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f  _STAT_WRITE 2../
8720: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
8730: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
8740: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
8750: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
8760: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
8770: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
8780: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
8790: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
87a0: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
87b0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
87c0: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
87d0: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
87e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
87f0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
8800: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8820: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
8830: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
8840: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8850: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
8870: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
8880: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
8890: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
88a0: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
88b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
88c0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
88d0: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
88e0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
88f0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
8900: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8910: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
8920: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
8930: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
8940: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
8950: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
8960: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
8970: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
8980: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
8990: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
89a0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
89b0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
89c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
89d0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
89e0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
89f0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
8a00: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
8a10: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
8a20: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8a30: 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74  s being.** writt
8a40: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
8a50: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
8a60: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
8a70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8a80: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
8a90: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
8aa0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
8ab0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
8ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
8ad0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
8ae0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
8af0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
8b00: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
8b10: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
8b20: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
8b30: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
8b40: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
8b50: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
8b60: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
8b70: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
8b80: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
8b90: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
8ba0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
8bb0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
8bc0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
8bd0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
8be0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
8bf0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
8c00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8c10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c20: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
8c30: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
8c40: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
8c50: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
8c60: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
8c70: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
8c80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8c90: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
8ca0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
8cb0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
8cc0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
8cd0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
8ce0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
8cf0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
8d00: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
8d10: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
8d20: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
8d30: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
8d40: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
8d50: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
8d60: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
8d70: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
8d80: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
8d90: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
8da0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
8db0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
8dc0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
8dd0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
8de0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
8df0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
8e00: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
8e10: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
8e20: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
8e30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
8e40: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
8e50: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
8e60: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
8e70: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
8e80: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
8e90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
8ea0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65  size of the of e
8eb0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20  ach page record 
8ec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
8ed0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68  s given by.** th
8ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
8ef0: 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  o..*/.#define JO
8f00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
8f10: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
8f20: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
8f30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8f40: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
8f50: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69   this pager. Thi
8f60: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65  s is usually the
8f70: 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61   same .** size a
8f80: 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  s a single disk 
8f90: 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f  sector. See also
8fa0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29   setSectorSize()
8fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8fc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8fd0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
8fe0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
8ff0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
9000: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9010: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9020: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9030: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
9040: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
9050: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
9060: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9070: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
9080: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
9090: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
90a0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
90b0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
90c0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
90d0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
90e0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
90f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9100: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
9110: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
9120: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
9130: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
9140: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
9150: 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54  The macro USEFET
9160: 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77 65  CH is true if we
9170: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
9180: 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20 61  use the xFetch a
9190: 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69  nd xUnfetch.** i
91a0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63 63  nterfaces to acc
91b0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
91c0: 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61   using memory-ma
91d0: 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66  pped I/O..*/.#if
91e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
91f0: 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65  _SIZE>0.# define
9200: 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28 78   USEFETCH(x) ((x
9210: 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65  )->bUseFetch).#e
9220: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45  lse.# define USE
9230: 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69  FETCH(x) 0.#endi
9240: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
9250: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
9260: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
9270: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
9280: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
9290: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
92a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
92b0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
92c0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
92d0: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
92e0: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
92f0: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9300: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9310: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9320: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9330: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
9340: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
9350: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
9360: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
9380: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
9390: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
93a0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
93b0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
93c0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
93d0: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
93e0: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
93f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9400: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9410: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9420: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9430: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9440: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9450: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9470: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
9490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
94a0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
94b0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
94c0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
94d0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
94e0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
94f0: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9500: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9510: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9520: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9530: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9540: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9550: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9560: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9570: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9580: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
95a0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
95b0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
95c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
95d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
95e0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
95f0: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9600: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9610: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9620: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9630: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9650: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9660: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9670: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9680: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9690: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
96a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
96b0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
96c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
96e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
96f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9700: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9710: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9720: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9730: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9740: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9750: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9760: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9770: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9780: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9790: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97a0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
97b0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
97c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
97d0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
97e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
97f0: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9800: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9810: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9820: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9830: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9840: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9850: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9860: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9870: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9880: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9890: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
98a0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
98b0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
98c0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
98d0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
98e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
98f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9900: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9910: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9920: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9930: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9940: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9950: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9960: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9970: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9980: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9990: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
99a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
99b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
99c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
99d0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
99e0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
99f0: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9a00: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9a10: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9a20: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9a30: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9a40: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9a50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9a60: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9a70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9a80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9a90: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9aa0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9ab0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9ac0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9ad0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9ae0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9af0: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9b00: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9b20: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9b30: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9b40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9b50: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9b60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9b70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9b80: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9b90: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9ba0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9bb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9bc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9bd0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9be0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9bf0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9c00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9c10: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9c30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c50: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9c60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9c70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c80: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9cb0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9cc0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ce0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9d00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9d10: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9d20: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9d30: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9d40: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9d50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9d70: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9d80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9d90: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9da0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9db0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9dc0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9dd0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9de0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9df0: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9e00: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9e10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9e40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9e50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9e60: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9e70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9e90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9ea0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9eb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9ec0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ed0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ee0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9ef0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9f00: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f10: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9f30: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9f40: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f60: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9f70: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f80: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9f90: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9fa0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9fb0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9fd0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9fe0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a010: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a020: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a030: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a040: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a050: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a070: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a080: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a090: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0b0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a100: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a110: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a150: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a170: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a180: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a190: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a1a0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a1b0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a1c0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a1d0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a1e0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a1f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a200: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a210: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a220: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a230: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a240: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a250: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a260: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a270: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a280: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a290: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a2a0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2e0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a320: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a340: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a350: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a360: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a380: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a390: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3b0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3c0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a3d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a3f0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a400: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a410: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a440: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a450: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a460: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a480: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a490: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a4a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a4b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a4c0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a4d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a4e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a4f0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a510: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a520: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a530: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a540: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a550: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a560: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a570: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a580: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a590: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a5a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a5b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a5d0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a5e0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a5f0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a600: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a640: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a650: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a660: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a670: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a680: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a690: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a6a0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a6b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a6c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a6d0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a6e0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a6f0: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a700: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a720: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a730: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a740: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a750: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a760: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a770: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a780: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a790: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a7a0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a7b0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a7c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a7d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a7e0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a7f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a800: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a820: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a830: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a840: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a850: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a860: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a870: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a880: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a890: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a8a0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a8b0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a8c0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a8d0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a8e0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a8f0: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a900: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a910: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a920: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a930: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a940: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a950: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a960: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a970: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a980: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a990: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a9a0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a9b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a9c0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a9d0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a9e0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a9f0: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
aa00: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
aa10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
aa20: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
aa30: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
aa40: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aa50: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
aa60: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
aa70: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
aa80: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
aa90: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
aaa0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
aab0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
aac0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
aad0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
aae0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
aaf0: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ab00: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ab10: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ab20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ab30: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ab40: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ab50: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab60: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ab70: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ab80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ab90: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aba0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
abb0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
abc0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
abd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
abe0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
abf0: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
ac00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ac10: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
ac20: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
ac30: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
ac40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ac50: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
ac60: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
ac70: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ac80: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
ac90: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aca0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
acb0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
acc0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
acd0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
ace0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
acf0: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
ad00: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
ad10: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
ad20: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
ad30: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
ad40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
ad50: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
ad60: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
ad70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
ad80: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
ad90: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ada0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
adb0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
adc0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
add0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ade0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
adf0: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ae00: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ae10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae20: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ae30: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
ae40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
ae50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae60: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
ae70: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
ae80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ae90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aea0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
aeb0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
aec0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aed0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aee0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
aef0: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
af00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af20: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
af30: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
af40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
af50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
af60: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
af70: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
af90: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
afa0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
afb0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
afc0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
afd0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
afe0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
aff0: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b000: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b010: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b020: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b030: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b060: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b070: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b080: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b090: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b0a0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b0b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b0c0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b0d0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b0e0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b0f0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b100: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b110: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b120: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b130: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b140: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b150: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b160: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b170: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b180: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b1a0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b1b0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b1c0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b1d0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b1e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b1f0: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b200: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b210: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b220: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b230: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b240: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b250: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b260: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b270: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b280: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b290: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b2a0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
b2b0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b2d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2f0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
b300: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b320: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b330: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
b340: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b350: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
b360: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
b370: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
b380: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
b390: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
b3a0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b3b0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b3c0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b3d0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b3e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b3f0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b400: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b410: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b420: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b430: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b450: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b460: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b470: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b480: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b490: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b4a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b4b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b4c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b4e0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b4f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b500: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b510: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b530: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b540: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b560: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b570: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b580: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b590: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b5a0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b5b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b5c0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b5d0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b5e0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b5f0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b600: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b610: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b620: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b630: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b640: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b650: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b660: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b680: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b690: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b6a0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b6b0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b6c0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b6d0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b6e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b6f0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b710: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b720: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b730: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b740: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b750: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b760: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b770: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b780: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b790: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b7a0: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b7b0: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b7c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b7d0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b7e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b7f0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b800: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b810: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b820: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b830: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b840: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b850: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b860: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b870: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b880: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b890: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b8a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b8b0: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b8c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b8d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b8e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b8f0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b900: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b910: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b920: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b930: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b940: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b950: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b960: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b970: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b980: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b990: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b9a0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b9c0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b9d0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
b9e0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
b9f0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
ba00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
ba10: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
ba20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
ba30: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
ba40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
ba50: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
ba60: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
ba70: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
ba80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
ba90: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
baa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bab0: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bac0: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bad0: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bae0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
baf0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bb00: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bb10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bb20: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bb30: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bb40: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bb50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bb60: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bb70: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bb80: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bb90: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bba0: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bbb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bbc0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bbd0: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bbe0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bbf0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bc00: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bc10: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bc20: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bc30: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bc40: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bc50: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc70: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bc80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bc90: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bcb0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bcc0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bcd0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bce0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bcf0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bd00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bd10: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bd20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bd30: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bd40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
bd50: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bd60: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bd70: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bd90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bda0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bdb0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bdc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bdd0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bde0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bdf0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
be10: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
be20: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
be30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
be50: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
be60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
be70: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
be80: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
be90: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bea0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
beb0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bec0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bed0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bee0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bef0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bf00: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bf10: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bf20: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bf30: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bf40: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bf50: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bf60: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bf70: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bf80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bf90: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bfa0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bfb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bfc0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bfd0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bfe0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bff0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c000: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c010: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c020: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c030: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c040: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c050: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c060: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c080: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c090: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c0a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c0b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c0d0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c0e0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c0f0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c100: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c110: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c120: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c130: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c140: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c150: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c160: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c170: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c180: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c1b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c1c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c1d0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c1f0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c200: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c230: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c240: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c250: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c260: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c270: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c280: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c290: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c2a0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c2b0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c2c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c2d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c2e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c2f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c300: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c310: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c320: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c330: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c340: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c350: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c360: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c370: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c390: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c3a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c3b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c3c0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c3d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c3e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c3f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c400: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c410: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c420: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c430: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c440: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c450: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c460: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c470: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c480: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c490: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c4a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c4b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c4c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c4d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c4e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c4f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c500: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c520: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c530: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c540: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c550: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c560: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c570: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c580: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c590: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c5a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c5b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c5c0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c5d0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c5e0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c5f0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c600: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c610: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c620: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c650: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c660: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c670: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c680: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c690: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c6a0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c6b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c6c0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c6d0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c6e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c6f0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c700: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c710: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c720: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c730: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c740: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c750: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c760: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c780: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c790: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c7b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c7c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c7d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c7e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c7f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c800: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c810: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c820: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c830: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c840: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c850: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c860: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c870: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c880: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c890: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c8a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c8b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c8c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c8d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c8e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c8f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c900: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c920: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c930: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c940: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c950: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c960: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c970: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c980: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c990: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c9a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c9b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c9c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c9d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c9e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c9f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
ca00: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
ca10: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
ca20: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
ca30: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
ca40: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
ca50: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
ca60: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
ca70: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
ca80: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
ca90: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
caa0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cab0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cad0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cae0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
caf0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cb00: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cb10: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cb20: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cb30: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cb40: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cb50: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cb70: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cb80: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cb90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cba0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cbb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cbc0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cbd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cbe0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cbf0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cc00: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cc10: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cc20: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cc30: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cc40: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cc50: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cc60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cc70: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cc80: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cc90: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ccb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccc0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ccd0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ccf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cd00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cd10: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cd20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cd30: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cd40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cd50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cd60: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cd70: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cd80: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cd90: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cda0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cdb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cdc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cdd0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cde0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cdf0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ce00: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ce10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ce20: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce40: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
ce50: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
ce60: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
ce70: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ce90: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cea0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ceb0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cf00: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cf10: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cf20: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cf30: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cf40: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cf50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cf60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cf70: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cf80: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cf90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cfa0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cfb0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cfc0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cfd0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cfe0: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
cff0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d000: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d010: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d020: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d030: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d040: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d050: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d060: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d070: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d080: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d090: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d0b0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d0c0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d0d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d0e0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d0f0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d100: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d110: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d120: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d130: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d140: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d150: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d160: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d170: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d180: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d190: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d1a0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d1b0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d1c0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d1e0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d1f0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d200: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d210: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d230: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d240: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d250: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d260: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d270: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d280: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d290: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d2a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d2b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d2c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d2d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d2e0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d2f0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d300: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d310: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d320: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d330: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d340: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d350: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d360: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d370: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d380: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d390: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d3a0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3d0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d420: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d430: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d440: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d460: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d470: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d480: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d490: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d4a0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d4b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d4c0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d4d0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d4e0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d4f0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d500: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d510: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d520: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d530: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d540: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d550: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d570: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d580: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d590: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d5b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d5c0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d5d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d5e0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d5f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d600: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d610: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d620: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d630: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d640: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d650: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d660: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d670: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d680: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d690: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d6a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d6b0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d6c0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d6d0: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d6e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d6f0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d700: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d710: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d720: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d730: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d740: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d750: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d760: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d770: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d780: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d790: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d7a0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d7b0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d7c0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d7d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d7e0: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d7f0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d800: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d810: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d820: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d830: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d840: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d850: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d860: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d870: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d880: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d890: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d8a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d8b0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d8c0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d8d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d8e0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d8f0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d900: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d910: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d920: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d930: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d940: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d950: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
d960: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
d970: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
d980: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
d990: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
d9a0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
d9b0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
d9c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
d9d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da00: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
da10: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
da20: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
da30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da40: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
da50: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
da60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
da70: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
da80: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
da90: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
daa0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dab0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dac0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dad0: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dae0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
daf0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
db00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
db10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
db20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
db30: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
db40: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
db50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
db60: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
db70: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
db80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
db90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dba0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dbb0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dbc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dbd0: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dbe0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dbf0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dc00: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dc10: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dc20: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dc30: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dc40: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dc50: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dc60: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dc70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dc80: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dc90: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dcb0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dcc0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dcd0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dce0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dcf0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
dd00: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dd10: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
dd20: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dd30: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dd40: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
dd50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dd60: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
dd70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd80: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
dd90: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
dda0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
ddb0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ddc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
ddd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
dde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
ddf0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
de00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
de20: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
de30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
de80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
de90: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
dea0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
deb0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
dec0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ded0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
dee0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
def0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
df00: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
df10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
df20: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
df30: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
df40: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
df50: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
df60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df70: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
df80: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
df90: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
dfa0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
dfb0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
dfc0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
dfd0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
dfe0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
dff0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e000: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e010: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e020: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e030: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e040: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e050: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e060: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e070: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e080: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e090: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e0a0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e0b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e0c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e110: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e120: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e130: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e140: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e150: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e160: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e170: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e180: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e190: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e1a0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e1b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e1e0: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e1f0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e200: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e230: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e240: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e250: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e260: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e270: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e280: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e290: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e2a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e2b0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e2c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e2e0: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e2f0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e300: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e310: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e320: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e340: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e350: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e360: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e370: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e380: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e390: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e3a0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e3b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e3c0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e3d0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e3e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e3f0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e400: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e430: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e440: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e450: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e460: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e470: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e480: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e490: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e4a0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e4b0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e4c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e4d0: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e4e0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e4f0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e500: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e510: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e520: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e550: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e560: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e570: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e580: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e590: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e5a0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e5b0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e5c0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e5d0: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e5e0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e5f0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e600: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e610: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e620: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e630: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e640: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e650: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e660: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e670: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e690: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e6a0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e6b0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e6c0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e6d0: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e6e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e6f0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e700: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e710: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e720: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e730: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e740: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e750: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e760: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e770: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e780: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e790: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e7a0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e7b0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e7c0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e7d0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e7e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e7f0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e800: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e810: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e820: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e830: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e840: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e850: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e860: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e870: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e880: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e890: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e8a0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e8b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e8c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e8d0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e8e0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e8f0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e900: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e910: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e920: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e930: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e940: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
e950: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e960: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
e970: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e980: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e990: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
e9b0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
e9c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9d0: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
e9e0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
e9f0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ea00: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ea10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ea20: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ea30: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ea40: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ea50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ea60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ea70: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ea80: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ea90: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eaa0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eab0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eac0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ead0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eae0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eaf0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
eb00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
eb10: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
eb20: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
eb30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb50: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
eb60: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
eb70: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
eb80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
eb90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
eba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ebb0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ebc0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ebd0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ebe0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ebf0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ec00: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ec10: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ec20: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ec30: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ec40: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ec50: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ec60: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ec70: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ec80: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ec90: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
eca0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ecb0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ecc0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ecd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ece0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ecf0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ed00: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ed10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ed20: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ed30: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
ed40: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ed50: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ed60: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ed70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ed80: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ed90: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
eda0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
edb0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
edc0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
edd0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ede0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
edf0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ee00: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ee10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ee20: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ee30: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
ee40: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ee50: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ee60: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ee70: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ee80: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ee90: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
eea0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
eeb0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
eec0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
eed0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
eee0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
eef0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
ef00: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
ef10: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
ef20: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
ef30: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
ef40: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
ef50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
ef60: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
ef70: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
ef80: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
ef90: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
efa0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
efb0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
efc0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
efd0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
efe0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
eff0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f000: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f010: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f020: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f030: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f040: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f050: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f060: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f070: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f080: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f090: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f0a0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f0b0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f0c0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f0d0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f0e0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f0f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f100: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f110: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f120: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f130: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f140: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f150: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f170: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f180: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1a0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f1b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f1c0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f1d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f1e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f1f0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f200: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f230: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f240: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f260: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f270: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f290: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f2a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f2b0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f2c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f2e0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f310: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f320: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f330: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f340: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f360: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f370: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f380: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f390: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f3a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f3b0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f3c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f3d0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f3e0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f3f0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f400: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f410: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f420: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f430: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f440: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f450: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f460: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f470: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f480: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f490: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f4a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f4b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4c0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f4d0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f4e0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f4f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f500: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f510: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f520: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f530: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f540: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f560: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f570: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f580: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f590: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f5a0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f5c0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f5d0: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f5e0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f600: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f610: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f620: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f630: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f640: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f650: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f660: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f670: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f690: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f6a0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f6b0: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f6c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f6f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f700: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f710: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f720: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f730: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f740: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f760: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f770: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f790: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f7a0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f7b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f7c0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f7d0: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f7e0: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f7f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f800: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f810: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f820: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f830: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f840: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f850: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f860: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f870: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f890: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f8a0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f8b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f8c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f8d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f8e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f900: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f910: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f920: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f930: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f940: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
f950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f960: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
f970: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
f980: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
f990: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
f9a0: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
f9b0: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
f9c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
f9d0: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
f9e0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f9f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fa00: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fa10: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fa20: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fa30: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fa40: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fa60: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fa70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fa80: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fa90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
faa0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fab0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fac0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fad0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fae0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
faf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fb00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fb20: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fb30: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fb40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fb50: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fb60: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fb70: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fb80: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fb90: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fba0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fbb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fbc0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fbd0: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fbe0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fbf0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fc00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fc10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fc20: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fc30: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fc40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fc50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fc60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fc70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fc80: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fc90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fca0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fcb0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fcc0: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fcf0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fd00: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fd10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fd20: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fd30: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fd40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fd50: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fd70: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fd80: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fd90: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fda0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fdb0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fde0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fdf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fe00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fe10: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fe20: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fe30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
fe60: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
fe70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
fe80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fe90: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
fea0: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
feb0: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
fec0: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
fed0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
fef0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ff00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ff10: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ff20: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ff30: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
ff40: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ff50: 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
ff60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
ff70: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
ff80: 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
ff90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
ffa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
ffb0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
ffc0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
ffd0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
ffe0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
fff0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10000 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10010 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10020 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10030 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10040 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10050 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10060 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10070 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10080 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10090 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
100a0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
100b0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
100c0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
100d0 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
100e0 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
100f0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10100 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10110 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10120 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10130 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10140 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10150 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10160 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10170 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10180 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
101a0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
101b0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
101c0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
101d0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
101e0 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
101f0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10200 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10210 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10220 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10230 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10240 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10250 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10260 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10270 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10290 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
102a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
102b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
102c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
102d0 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
102e0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
102f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10300 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10310 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10320 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10330 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10340 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10350 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10360 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10370 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10390 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
103a0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
103b0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
103c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
103d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
103e0 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
103f0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10400 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10410 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10420 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10430 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10440 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10450 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10460 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10470 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10480 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10490 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
104a0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
104b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
104c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
104d0 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
104e0 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
104f0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10500 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10510 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10520 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10530 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10540 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10550 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10560 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10570 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10580 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
105a0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
105b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
105c0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
105d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
105e0 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
105f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10600 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10610 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10620 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10630 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
10640 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10650 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10660 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10670 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10680 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10690 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
106a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
106b0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
106c0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
106d0 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
106e0 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
106f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10700 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10710 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10730 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
10740 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10750 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10760 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10770 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10780 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10790 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
107a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
107b0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
107c0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
107d0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
107e0 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
107f0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10800 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10810 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10820 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10830 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
10840 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10850 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10860 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10870 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10880 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10890 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
108a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
108b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
108c0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
108d0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
108e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
108f0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10900 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10910 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10950 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10960 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10980 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10990 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
109a0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
109d0 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
109e0 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
109f0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10a00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10a10 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10a20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10a30 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a50 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10a60 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10a80 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10aa0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10ab0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10ac0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10af0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10b00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10b10 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10b40 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10b60 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10b80 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10b90 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10ba0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10bb0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10bc0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10bd0 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10be0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10bf0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10c00 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10c10 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10c20 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10c30 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10c40 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10c50 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10c60 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10c70 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10c80 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10c90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10ca0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10cb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10cc0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10cd0 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10ce0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10cf0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10d10 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10d20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10d30 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10d50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10d60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10d70 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10d90 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10da0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10db0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10dc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10dd0 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10de0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10df0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10e00 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10e10 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10e20 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10e30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10e40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10e50 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10e60 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10e70 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10e80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10e90 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ea0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10eb0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10ec0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10ed0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10ee0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10ef0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10f00 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10f20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10f30 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10f40 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10f50 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
10f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10f70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10f80 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
10f90 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
10fa0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
10fb0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
10fc0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
10fd0 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
10fe0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
10ff0 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11000 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11010 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11020 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11030 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11040 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11050 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11060 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11070 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11080 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11090 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
110a0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
110b0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
110c0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
110d0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
110e0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
110f0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11100 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11110 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11120 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11130 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11140 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11150 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11160 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11170 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11180 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11190 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
111a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
111b0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
111c0 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
111d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
111e0 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
111f0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11200 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11220 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11240 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11250 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11260 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11270 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11280 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11290 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
112a0 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  {.  sqlite3Backu
112b0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
112c0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
112d0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
112e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
112f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
11300 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
11310 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
11320 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
11330 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
11340 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11350 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
11360 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
11370 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
11380 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
11390 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
113a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
113b0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
113c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
113e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
113f0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11410 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
11420 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
11430 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
11440 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11450 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11460 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
11470 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11480 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11490 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
114a0 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
114b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
114c0 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
114d0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
114e0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11520 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
11530 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
11540 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
11550 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
11560 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11570 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
11580 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
11590 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
115a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
115b0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
115c0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
115d0 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
115e0 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
115f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
11600 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
11610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
11620 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
11630 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
11640 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
11650 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
11660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11670 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
11680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
116a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
116b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
116c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
116d0 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
116e0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
116f0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11700 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
11710 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11730 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
11740 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
11750 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
11760 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
11770 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
11780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
117a0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
117b0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
117c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
117d0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
117e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11800 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
11810 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
11820 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11830 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e  de and not.** in
11840 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
11850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
11860 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67  switches the pag
11870 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  er to PAGER_OPEN
11880 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  .** state..**.**
11890 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
118a0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
118b0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74  e-access mode, t
118c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
118d0 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c   is.** completel
118e0 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74  y unlocked. If t
118f0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
11900 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ked and the file
11910 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20  -system does.** 
11920 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20  not exhibit the 
11930 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11940 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20  _OPEN property, 
11950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11960 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69   is.** closed (i
11970 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a  f it is open)..*
11980 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11990 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74  r is in ERROR st
119a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
119b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
119c0 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  , the .** conten
119d0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
119e0 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72  cache are discar
119f0 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63  ded before switc
11a00 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a  hing back to .**
11a10 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
11a20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
11a30 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72  hether the pager
11a40 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11a50 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c  -mode.** or not,
11a60 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
11a70 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
11a80 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62  le-system will b
11a90 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20  e treated.** as 
11aa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
11ab0 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  d rolled back th
11ac0 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65  e next time a re
11ad0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  ad-transaction.*
11ae0 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20  * is opened (by 
11af0 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f  this or by any o
11b00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  ther connection)
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
11b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
11b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
11b60 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c  EADER .       ||
11b70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11b80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20  =PAGER_OPEN .   
11b90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11ba0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11bb0 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69  OR .  );..  sqli
11bc0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11bd0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11be0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11bf0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11c00 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
11c10 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
11c20 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
11c30 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
11c40 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
11c50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
11c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
11c70 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
11c80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
11c90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
11ca0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
11cb0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
11cc0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11cd0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
11ce0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
11d00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
11d10 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
11d20 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
11d30 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
11d40 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
11d50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11d60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
11d70 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
11d80 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
11d90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
11da0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
11db0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
11dc0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
11dd0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
11de0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
11df0 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
11e00 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
11e10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
11e20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
11e30 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
11e40 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
11e50 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
11e60 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
11e70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11e90 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
11ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11eb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ec0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
11ed0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11ee0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11ef0 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
11f00 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11f10 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f20 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
11f30 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11f40 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11f50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
11f60 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
11f70 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
11f90 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
11fa0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
11fb0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
11fc0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
11fd0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
11fe0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
11ff0 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12010 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12020 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12030 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12040 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12050 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12060 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12080 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12090 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
120a0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
120b0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
120c0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
120d0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
120e0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
120f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12100 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12110 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12120 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12130 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12140 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12170 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12180 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12190 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
121a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
121b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
121c0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
121d0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
121e0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
121f0 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12200 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12210 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12220 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12230 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12240 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12250 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12260 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12270 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12280 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
122a0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
122b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
122c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
122d0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
122e0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
122f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12300 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12310 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12320 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12330 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12340 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12350 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12360 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12370 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12380 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12390 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
123a0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
123b0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
123c0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
123d0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
123e0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
123f0 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12400 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
12420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
12430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
12440 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
12450 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12460 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12470 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
12480 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
124a0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
124b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
124c0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
124d0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
124e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
124f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12500 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12510 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12520 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12540 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12550 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12560 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12580 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12590 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
125a0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
125b0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125c0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125d0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125e0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125f0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12600 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12610 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12620 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12630 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12640 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12650 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12660 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12670 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12680 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12690 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
126a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126c0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126e0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12700 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12710 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12720 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12730 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12740 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12750 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12760 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12770 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12780 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12790 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127a0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
127b0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127c0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127d0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127e0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127f0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12800 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12810 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12820 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12830 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12840 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12850 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12860 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12870 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12890 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
128a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
128b0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128c0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128d0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12900 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12910 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12920 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12940 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12950 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12960 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12970 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12980 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12990 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
129a0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
129b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129f0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12a00 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a30 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a40 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a50 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a60 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a70 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a80 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a90 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12aa0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12ab0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12ac0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ae0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12af0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12b00 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12b10 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b50 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b60 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b70 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b80 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b90 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12ba0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12bb0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12bc0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12be0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12c00 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12c10 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c20 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c60 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c70 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c80 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c90 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12ca0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12cb0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12cc0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cd0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12ce0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cf0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12d00 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12d10 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d20 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d30 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d40 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d60 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d70 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d80 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d90 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12da0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12db0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12dc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12dd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12de0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12df0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12e00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12e10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12ea0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12eb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ec0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ed0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ee0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12f00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12f10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12fa0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12fb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fe0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13000 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13010 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13020 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13030 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13040 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13050 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13070 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13090 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
130a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
130b0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130c0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130e0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13100 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13110 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13120 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13130 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13140 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13150 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13170 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13180 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13190 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
131a0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
131b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131d0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131e0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13200 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13210 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13220 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13230 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13240 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13250 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13260 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13270 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13280 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13290 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
132a0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
132b0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132f0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13310 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13320 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13330 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13350 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13360 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13370 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13380 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13390 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
133a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
133b0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133c0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133d0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133e0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13400 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13410 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13420 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13430 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13440 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13450 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13460 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13470 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13480 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13490 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
134a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
134b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13500 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13530 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13540 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13550 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13560 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13570 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13580 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13590 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
135a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
135b0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135c0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135d0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135f0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13600 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
13610 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13620 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13630 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13640 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13650 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13660 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13670 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13680 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13690 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
136a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
136b0 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136c0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136e0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136f0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13700 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
13710 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13720 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13730 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13740 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13750 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13760 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13770 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13780 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13790 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
137a0 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
137b0 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137c0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137d0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137f0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13800 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
13810 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13820 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13830 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13840 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13850 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13860 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13870 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13890 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
138a0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
138b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138c0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138d0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138e0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13910 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13920 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13930 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13940 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13950 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13980 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13990 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
139a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
139b0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a30 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13b00 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13b10 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b70 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b80 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13bb0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13bc0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13be0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bf0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13c00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13c10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c30 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c40 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c50 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c60 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c70 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c80 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13ca0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13cb0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13cc0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cd0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13ce0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cf0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13d00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13d10 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d20 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d40 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d50 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d60 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d70 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d80 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d90 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13dc0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13dd0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13de0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13df0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13e00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13e10 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e50 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e60 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e70 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e80 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13ea0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13eb0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ec0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13ed0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ee0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ef0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13f00 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13f10 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f20 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f30 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f50 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f60 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f70 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f80 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f90 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
13fa0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
13fb0 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
13fc0 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
13fd0 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
13fe0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13ff0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
14000 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14010 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
14020 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
14030 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
14040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14050 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14060 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14070 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14080 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14090 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
140a0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
140b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
140c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
140d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
140e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
140f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14100 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14110 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14130 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14150 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14160 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14170 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14180 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14190 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
141a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
141c0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
141d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
141e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
141f0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14220 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14230 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14240 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14250 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14260 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14270 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14280 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14290 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
142a0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
142c0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
142d0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
142e0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
142f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14300 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14310 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14330 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14340 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14350 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14360 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14370 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14380 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14390 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
143a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
143b0 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
143c0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
143d0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
143e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143f0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14400 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14410 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14420 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14430 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14440 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14450 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14460 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14470 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14480 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14490 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
144a0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
144b0 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
144c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
144d0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
144e0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
144f0 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
14500 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14510 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14520 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14530 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14540 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14550 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14560 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14570 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14580 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14590 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
145a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
145b0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
145c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
145d0 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
145e0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
145f0 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14600 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14610 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14620 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14630 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14640 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14650 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14660 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14670 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14680 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14690 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
146a0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
146b0 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
146c0 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
146d0 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
146e0 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
146f0 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14700 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14710 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14720 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14730 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14750 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14760 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14770 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14780 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14790 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
147a0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
147b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
147c0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
147d0 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
147e0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
147f0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14800 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14810 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14820 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14830 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14840 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
14850 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14860 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14870 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14880 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14890 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
148a0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
148b0 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
148c0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
148d0 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
148e0 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
148f0 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14900 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14910 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14920 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14940 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14950 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14960 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14970 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14980 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14990 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
149a0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
149b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
149c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
149d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
149e0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
149f0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14a10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a30 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14a40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14a50 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14a60 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14a70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14a80 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14a90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14aa0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14ab0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14ac0 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14ad0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14ae0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14af0 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14b00 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14b10 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14b20 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14b30 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14b40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14b50 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14b60 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14b70 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14b80 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14b90 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14ba0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14bb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14bc0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14bd0 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14be0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14bf0 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14c00 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14c10 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14c20 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14c30 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14c40 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14c50 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14c60 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14c70 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14c80 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14c90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14ca0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14cb0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14cc0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14cd0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14ce0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14cf0 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14d00 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14d10 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14d20 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14d30 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14d40 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14d50 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14d60 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14d70 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14d80 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14d90 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14da0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14db0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14dc0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14dd0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14de0 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14df0 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14e00 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14e10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14e20 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14e30 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14e40 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14e50 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14e60 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14e70 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14e80 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14e90 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14ea0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14eb0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14ec0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14ed0 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14ee0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14ef0 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14f00 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14f10 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14f20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14f30 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14f40 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14f50 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14f60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14f70 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14f80 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14f90 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14fa0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14fb0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14fe0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14ff0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15000 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
15010 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
15020 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15030 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
15040 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15060 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
15070 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
15080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
15090 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
150a0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
150b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
150e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
150f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
15100 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
15110 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
15120 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
15130 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
15140 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
15150 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
15160 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
15170 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15180 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15190 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
151a0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
151b0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
151c0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
151d0 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
151e0 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
151f0 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
15200 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15210 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
15220 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
15230 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
15240 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
15250 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
15260 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
15270 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15280 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15290 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
152a0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
152b0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
152c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
152d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
152e0 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
152f0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15300 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15310 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15320 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
15330 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
15340 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
15350 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15360 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15380 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15390 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
153a0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
153b0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
153c0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
153d0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
153e0 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
153f0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15400 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15410 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15420 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
15430 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
15440 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
15450 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15460 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15470 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15480 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15490 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
154a0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
154b0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
154c0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
154d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
154e0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
154f0 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15500 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15510 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15520 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15530 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
15540 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
15550 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15560 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15570 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15580 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15590 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
155a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
155b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
155c0 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
155d0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
155e0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
155f0 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15600 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15610 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
15620 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
15630 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
15640 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
15650 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15660 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15670 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15680 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15690 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
156a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
156b0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
156c0 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
156d0 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
156e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
156f0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15700 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15710 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
15720 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
15730 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
15740 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
15750 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15760 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15770 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15780 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15790 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
157a0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
157b0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
157c0 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
157d0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
157e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
157f0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15800 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15810 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
15820 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
15830 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15840 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15850 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15860 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15870 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15890 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
158a0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
158b0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
158c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
158d0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
158e0 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
158f0 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15900 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15910 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15920 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15930 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15940 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15950 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15960 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15970 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15980 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159a0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
159b0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
159c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
159d0 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159f0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15a00 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15a10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15a40 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15a50 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15a60 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a80 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15a90 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15aa0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15ab0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15ac0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15ad0 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15ae0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15af0 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15b10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15b20 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15b30 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15b40 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15b60 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15b70 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15b80 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15b90 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15ba0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15bb0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15bc0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15bd0 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15be0 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15bf0 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15c00 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15c10 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15c20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15c30 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15c40 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15c50 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15c60 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15c70 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15c80 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15c90 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15ca0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15cb0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15cc0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15cd0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15ce0 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15cf0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15d00 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15d10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15d20 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15d30 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15d40 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15d50 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15d60 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15d70 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15d80 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15d90 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15da0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15db0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15dc0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15dd0 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15de0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15df0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15e00 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15e10 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15e20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15e30 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15e40 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15e50 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15e60 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15e70 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15e80 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15e90 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15ea0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15ec0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15ed0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15ee0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15ef0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15f00 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15f10 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15f20 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15f40 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15f50 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15f60 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15f70 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15f80 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15f90 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15fa0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15fb0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15fc0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15fd0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15fe0 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15ff0 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
16000 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
16010 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
16020 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
16030 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
16040 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
16050 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16080 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16090 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
160a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
160b0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
160c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
160d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
160e0 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
160f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16100 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
16110 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
16120 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
16130 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
16140 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
16150 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
16160 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
16170 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16180 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16190 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
161a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
161b0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
161c0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
161d0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
161e0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
161f0 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
16200 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
16210 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
16220 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16230 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
16240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
16250 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
16260 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
16270 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16280 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
162a0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
162b0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
162c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
162d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
162e0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
162f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16300 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16310 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16320 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
16330 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
16340 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
16350 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16360 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16370 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16380 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16390 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
163a0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
163b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
163c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
163d0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
163e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
163f0 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16400 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16410 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16420 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16430 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16440 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16450 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16460 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16470 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16480 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
164a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
164b0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
164c0 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
164d0 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
164e0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
164f0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16500 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16510 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16520 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16530 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16540 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16550 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16560 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16570 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16580 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16590 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
165a0 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
165b0 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
165c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
165d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
165e0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
165f0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16600 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16610 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16620 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16630 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16640 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16650 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16660 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16680 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16690 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
166a0 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
166b0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
166c0 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
166d0 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
166e0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
166f0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16700 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16710 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16720 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16730 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16740 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16750 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16760 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16770 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16780 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16790 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
167a0 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
167b0 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
167c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
167d0 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
167e0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
167f0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16800 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16810 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16820 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16830 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16840 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
16850 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16860 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16870 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16880 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16890 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
168a0 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
168b0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
168c0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
168d0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
168e0 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
168f0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16900 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16910 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16920 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16930 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16940 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16950 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16960 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16970 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16980 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16990 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
169a0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
169b0 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
169c0 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
169d0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
169e0 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
169f0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16a00 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16a10 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16a20 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16a30 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16a40 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16a50 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16a60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16a70 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16a80 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16a90 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16aa0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16ab0 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16ac0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16ad0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16ae0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16af0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16b00 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16b10 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16b30 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16b40 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16b50 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16b60 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16b70 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16b80 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16b90 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16ba0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16bb0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16bc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16bd0 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16be0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16bf0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16c00 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16c10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16c20 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16c30 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16c40 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16c50 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16c60 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16c70 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16c80 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16c90 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16ca0 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16cb0 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16cc0 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16cd0 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16ce0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16cf0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16d00 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16d10 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16d20 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16d30 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16d40 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16d50 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16d60 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16d70 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16d80 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16d90 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16da0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16db0 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16dc0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
16dd0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
16de0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
16df0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
16e00 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
16e10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16e20 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
16e30 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
16e40 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
16e50 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
16e60 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
16e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
16e80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
16e90 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
16ea0 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
16eb0 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
16ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
16ed0 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
16ee0 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
16ef0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
16f00 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
16f10 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
16f20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
16f30 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
16f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
16f50 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
16f60 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
16f70 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
16f80 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
16f90 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
16fa0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
16fb0 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
16fc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16fd0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
16fe0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
16ff0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
17000 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
17010 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
17020 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
17030 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
17040 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17050 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17060 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17070 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17080 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17090 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
170a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
170b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
170c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
170d0 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
170e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
170f0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
17100 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
17110 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
17120 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
17130 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
17140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17150 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17160 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17170 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17180 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17190 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
171a0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
171b0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
171c0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
171d0 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
171e0 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
171f0 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
17200 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
17210 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
17220 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
17230 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
17240 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17250 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
17260 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
17270 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
17280 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
17290 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
172a0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
172b0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
172c0 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
172d0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
172e0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
172f0 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
17300 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
17310 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
17320 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
17330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
17340 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
17350 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
17360 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
17370 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
17380 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
17390 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
173a0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
173b0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
173c0 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
173d0 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
173e0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
173f0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
17400 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
17410 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
17420 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
17430 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17440 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
17450 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
17460 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
17470 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
17480 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
17490 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
174a0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
174b0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
174c0 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
174d0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
174e0 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
174f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
17500 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
17510 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
17520 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
17530 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
17540 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
17550 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
17560 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
17570 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
17580 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
17590 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
175a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
175b0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
175c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
175d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
175e0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
175f0 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
17600 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
17610 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
17620 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
17630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17640 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
17650 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
17660 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17670 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17680 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17690 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
176a0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
176b0 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
176c0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
176d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
176f0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17700 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17710 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
17720 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
17730 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
17740 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
17750 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
17760 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
17770 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
17780 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
17790 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
177a0 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
177b0 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
177c0 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
177d0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
177e0 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
177f0 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
17800 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
17810 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
17820 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
17830 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
17840 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
17850 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
17860 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
17870 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
17880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
17890 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
178a0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
178b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
178c0 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
178d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
178e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
178f0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
17900 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17910 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
17920 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
17930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
17940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
17950 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17960 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
17970 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
17980 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
17990 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
179a0 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
179b0 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
179c0 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
179d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
179e0 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
179f0 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
17a00 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
17a10 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
17a20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
17a30 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
17a40 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
17a50 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
17a60 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
17a70 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
17a80 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
17a90 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
17aa0 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
17ab0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
17ac0 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
17ad0 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
17ae0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
17af0 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
17b00 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
17b10 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
17b20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
17b30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
17b40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
17b50 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
17b60 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
17b70 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
17b80 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
17b90 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
17ba0 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
17bb0 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
17bc0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17bd0 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
17be0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
17bf0 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
17c00 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
17c10 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
17c20 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
17c30 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17c40 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
17c50 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
17c60 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
17c70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
17c80 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
17c90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
17ca0 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
17cb0 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
17cc0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17cd0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
17ce0 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
17cf0 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
17d00 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
17d10 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
17d20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17d30 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
17d40 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
17d50 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
17d60 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
17d70 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
17d80 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
17d90 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
17da0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17db0 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
17dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17dd0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17de0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17df0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17e00 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
17e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
17e20 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
17e30 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
17e40 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
17e50 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
17e60 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
17e70 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
17e80 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
17e90 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
17ea0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
17eb0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
17ec0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
17ed0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
17ee0 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
17ef0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17f00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
17f10 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
17f20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
17f30 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
17f40 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
17f50 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
17f60 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
17f70 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
17f80 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
17f90 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
17fa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
17fb0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
17fc0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17fd0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
17fe0 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
17ff0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
18000 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
18010 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18020 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
18030 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
18040 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
18050 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
18060 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18070 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
18080 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
18090 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
180a0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
180b0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
180c0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
180d0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
180e0 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
180f0 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
18100 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
18110 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
18120 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
18130 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18140 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
18150 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
18160 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
18170 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
18180 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
18190 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
181a0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
181b0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
181c0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
181d0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
181e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
181f0 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
18200 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
18210 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
18220 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18230 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
18240 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
18250 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
18260 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
18270 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
18280 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
18290 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
182a0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
182b0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
182c0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
182d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
182e0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
182f0 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
18300 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
18310 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
18320 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18330 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18340 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
18350 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18360 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18370 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
18380 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
18390 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
183a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
183b0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
183c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
183d0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
183e0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
183f0 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
18400 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
18410 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
18420 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
18430 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
18440 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18450 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
18460 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
18470 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18480 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
18490 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
184a0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
184b0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
184c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
184d0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
184e0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
184f0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
18500 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
18510 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
18520 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
18530 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
18540 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
18550 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18560 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
18570 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
18580 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
18590 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
185a0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
185b0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
185c0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
185d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
185e0 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
185f0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
18600 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
18610 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18620 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
18630 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
18640 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
18650 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18660 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
18670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
18680 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
18690 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
186a0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
186b0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
186c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
186d0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
186e0 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
186f0 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
18700 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
18710 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
18720 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
18730 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
18740 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
18750 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
18760 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18770 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
18780 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
18790 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
187a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
187b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
187c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
187d0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
187e0 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
187f0 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
18800 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
18820 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
18830 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
18840 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
18850 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
18860 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
18870 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
18880 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
18890 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
188a0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
188b0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
188c0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
188d0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
188e0 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
188f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18900 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
18910 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
18920 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
18930 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18940 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
18950 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
18960 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
18970 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
18980 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
18990 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
189a0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
189b0 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
189c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
189d0 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
189e0 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
189f0 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
18a00 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
18a10 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
18a20 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
18a30 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
18a40 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
18a50 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
18a60 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
18a70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
18a80 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
18a90 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
18aa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
18ab0 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
18ac0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
18ad0 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
18ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
18b00 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
18b10 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
18b20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
18b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
18b40 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
18b50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
18b60 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
18b70 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
18b80 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
18b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18ba0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18bb0 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
18bc0 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
18bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
18be0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
18bf0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
18c00 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
18c10 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
18c20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
18c30 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
18c40 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
18c50 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
18c60 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
18c70 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
18c80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
18c90 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
18ca0 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
18cb0 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
18cc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18cd0 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
18ce0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
18cf0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
18d00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18d10 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18d20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
18d30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
18d40 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
18d50 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
18d60 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
18d70 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
18d80 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
18d90 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18db0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
18dc0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
18dd0 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
18de0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
18df0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
18e00 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18e10 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18e20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18e30 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18e40 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
18e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18e60 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18e70 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
18e80 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
18e90 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
18ea0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
18eb0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
18ec0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
18ed0 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
18ee0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
18ef0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
18f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
18f10 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
18f20 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
18f30 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
18f40 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
18f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f60 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18f70 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
18f80 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
18f90 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
18fa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
18fb0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
18fc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
18fd0 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
18fe0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
18ff0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
19000 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
19010 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
19020 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
19030 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
19040 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19050 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
19060 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
19070 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
19080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19090 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
190a0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
190b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
190d0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
190e0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
190f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19110 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19120 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19130 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
19140 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
19150 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
19160 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
19170 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19180 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
19190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
191a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
191b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
191c0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
191d0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
191e0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
191f0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
19200 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
19210 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
19220 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
19230 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
19240 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
19250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
19260 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19270 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
19290 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
192a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
192b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
192c0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
192d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
192e0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
192f0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
19300 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
19310 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
19320 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
19330 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
19340 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
19350 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19360 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19370 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
19380 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19390 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
193a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
193b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
193c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
193d0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
193e0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
193f0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
19400 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
19410 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
19420 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
19430 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
19440 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
19450 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
19460 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
19470 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
19480 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
19490 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
194a0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
194b0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
194c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
194d0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
194e0 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
194f0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
19500 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
19510 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
19520 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
19530 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
19540 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
19550 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
19560 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
19570 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
19580 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
19590 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
195a0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
195b0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
195c0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
195d0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
195e0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
195f0 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
19600 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
19610 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
19620 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
19630 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
19640 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
19650 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
19660 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
19670 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
19680 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
19690 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
196a0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
196b0 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
196c0 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
196d0 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
196e0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
196f0 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
19700 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
19710 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
19720 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
19730 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
19740 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
19750 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
19760 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
19770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19780 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
19790 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
197a0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
197b0 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
197c0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
197d0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
197e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
197f0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
19800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19810 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
19820 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19830 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
19840 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
19850 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
19860 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
19870 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
19880 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
19890 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
198a0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
198b0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
198c0 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
198d0 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
198e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
198f0 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
19900 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
19910 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19920 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
19930 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
19940 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
19950 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
19960 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19970 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
19980 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
19990 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
199a0 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
199b0 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
199c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
199d0 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
199e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
199f0 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
19a00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
19a10 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
19a20 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
19a30 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
19a40 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
19a50 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
19a60 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19a70 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19a80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19a90 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19aa0 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19ab0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19ac0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19ad0 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
19ae0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19af0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19b00 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
19b10 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19b30 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19b40 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
19b50 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
19b60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19b70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19b80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19b90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
19ba0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
19bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19bd0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
19be0 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
19bf0 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
19c00 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
19c10 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
19c20 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
19c30 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
19c40 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
19c50 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19c60 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
19c70 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
19c80 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
19c90 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
19ca0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
19cb0 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
19cc0 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
19cd0 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
19ce0 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
19cf0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
19d00 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19d10 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19d20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
19d30 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
19d40 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
19d50 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
19d60 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
19d70 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
19d80 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
19d90 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
19da0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
19db0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
19dc0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
19dd0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
19de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19df0 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
19e00 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
19e10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
19e20 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
19e30 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
19e40 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
19e50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
19e60 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
19e70 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
19e80 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
19e90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
19ea0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19eb0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
19ec0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
19ed0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
19ee0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
19ef0 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
19f00 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19f10 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
19f20 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19f30 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
19f40 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
19f50 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
19f60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
19f70 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
19f80 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
19f90 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
19fa0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
19fb0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
19fc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
19fd0 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f   has the SQLITE_
19fe0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
19ff0 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72  OVERWRITE proper
1a000 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ty, then set.** 
1a010 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a020 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73  ctor size to its
1a030 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28   minimum value (
1a040 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f  512).  The purpo
1a050 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d  se of.** pPager-
1a060 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74  >sectorSize is t
1a070 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c  o define the "bl
1a080 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62  ast radius" of b
1a090 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67  ytes that.** mig
1a0a0 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63  ht change if a c
1a0b0 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c  rash occurs whil
1a0c0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73  e writing to a s
1a0d0 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a  ingle byte in.**
1a0e0 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75   that range.  Bu
1a0f0 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45  t with POWERSAFE
1a100 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20  _OVERWRITE, the 
1a110 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20  blast radius is 
1a120 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73  zero.** (that is
1a130 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f   what POWERSAFE_
1a140 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29  OVERWRITE means)
1a150 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65  , so we minimize
1a160 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73   the sector.** s
1a170 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ize.  For backwa
1a180 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1a190 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  y of the rollbac
1a1a0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  k journal file f
1a1b0 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e  ormat,.** we can
1a1c0 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65  not reduce the e
1a1d0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a1e0 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a  size below 512..
1a1f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1a200 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
1a210 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
1a220 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a230 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1a240 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1a250 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1a260 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28  tempFile.   || (
1a270 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1a280 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1a290 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20  Pager->fd) & .  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1a2b0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1a2c0 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30  FE_OVERWRITE)!=0
1a2d0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  .  ){.    /* Sec
1a2e0 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
1a2f0 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
1a300 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
1a310 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
1a320 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
1a330 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
1a340 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1a350 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
1a360 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
1a370 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ll segfault. */.
1a380 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1a390 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
1a3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1a3b0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1a3c0 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1a3d0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1a3e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
1a3f0 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
1a400 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
1a410 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
1a420 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
1a430 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
1a440 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
1a450 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
1a460 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
1a470 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
1a480 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
1a490 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
1a4a0 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
1a4b0 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
1a4c0 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
1a4d0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a4e0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a4f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1a500 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
1a510 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
1a520 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
1a530 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
1a540 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1a550 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
1a560 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
1a570 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
1a580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
1a590 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
1a5a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a5b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a5c0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
1a5d0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
1a5e0 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
1a5f0 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
1a600 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
1a610 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1a620 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
1a630 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
1a640 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
1a650 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
1a660 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
1a670 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a680 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a690 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
1a6a0 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
1a6b0 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
1a6c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1a6d0 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
1a6e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a6f0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
1a700 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
1a710 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
1a720 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
1a730 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
1a740 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
1a750 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
1a760 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
1a770 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
1a780 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
1a790 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
1a7a0 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
1a7b0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
1a7c0 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
1a7d0 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
1a7e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
1a7f0 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
1a800 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
1a810 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
1a820 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
1a830 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
1a840 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
1a850 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
1a860 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
1a870 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
1a880 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
1a890 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
1a8a0 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
1a8b0 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
1a8c0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
1a8d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
1a8e0 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
1a8f0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1a900 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
1a910 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
1a920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a930 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
1a940 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
1a950 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
1a960 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1a970 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
1a980 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
1a990 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
1a9a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1a9b0 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
1a9c0 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
1a9d0 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
1a9e0 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
1a9f0 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
1aa00 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
1aa10 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
1aa20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1aa30 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
1aa40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
1aa50 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
1aa60 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
1aa70 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
1aa80 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
1aa90 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
1aaa0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1aab0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
1aac0 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
1aad0 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
1aae0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
1aaf0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1ab00 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
1ab10 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
1ab20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
1ab30 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
1ab40 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
1ab50 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
1ab60 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1ab70 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
1ab80 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
1ab90 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
1aba0 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
1abb0 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
1abc0 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
1abd0 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
1abe0 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
1abf0 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
1ac00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1ac10 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
1ac20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1ac30 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1ac40 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1ac50 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
1ac60 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
1ac70 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
1ac80 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
1ac90 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
1aca0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1acb0 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
1acc0 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
1acd0 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
1ace0 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
1acf0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
1ad00 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
1ad10 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
1ad20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
1ad30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
1ad40 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
1ad50 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
1ad60 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
1ad70 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
1ad80 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1ad90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1ada0 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
1adb0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1adc0 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
1add0 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
1ade0 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
1adf0 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
1ae00 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
1ae10 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
1ae20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ae30 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
1ae40 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
1ae50 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
1ae60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1ae70 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
1ae80 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
1ae90 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
1aea0 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
1aeb0 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
1aec0 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
1aed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1aee0 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
1aef0 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
1af00 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
1af10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1af20 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
1af30 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
1af40 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
1af50 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1af60 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
1af70 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1af80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1af90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1afa0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1afb0 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
1afc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1afd0 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
1afe0 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1aff0 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
1b000 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1b010 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1b020 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
1b030 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b040 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
1b050 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
1b060 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
1b070 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b080 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b090 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
1b0a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
1b0b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1b0c0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
1b0d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
1b0e0 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
1b0f0 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
1b100 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b110 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b120 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
1b130 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
1b140 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
1b150 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
1b160 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
1b170 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
1b180 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20    int nPlayback 
1b190 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
1b1a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1b1b0 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ges restored fro
1b1c0 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20  m journal */..  
1b1d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1b1e0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1b1f0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1b200 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1b210 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1b220 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1b230 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1b240 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1b250 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1b260 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1b270 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1b280 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1b290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1b2a0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b2b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1b2c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1b2d0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1b2e0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1b2f0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1b300 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1b310 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1b320 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1b330 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1b340 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1b350 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1b360 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1b370 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1b380 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1b390 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1b3a0 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1b3b0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1b3c0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1b3d0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1b3e0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1b3f0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1b400 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1b410 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1b420 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1b430 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1b440 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1b450 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1b460 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1b470 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
1b480 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1b490 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1b4a0 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1b4b0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1b4c0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1b4d0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1b4e0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1b4f0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1b500 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1b510 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1b520 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1b530 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1b540 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1b550 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1b560 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1b570 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1b580 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1b590 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1b5a0 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1b5b0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1b5c0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1b5d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1b5e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1b5f0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1b600 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b610 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1b620 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1b630 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1b640 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1b650 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1b660 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1b670 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1b680 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1b690 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1b6a0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1b6b0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1b6c0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1b6d0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1b6e0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1b6f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1b700 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1b710 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1b720 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1b730 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1b740 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1b750 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1b760 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1b770 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1b780 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1b790 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1b7a0 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1b7b0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1b7c0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1b7d0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1b7e0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b7f0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1b800 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1b810 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1b820 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1b830 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1b840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1b850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b860 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1b870 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b880 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1b890 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b8a0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1b8b0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1b8c0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1b8d0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1b8e0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1b8f0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1b900 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1b910 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1b920 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1b930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1b940 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1b950 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1b960 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1b970 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1b980 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1b990 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b9a0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1b9b0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1b9c0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b9d0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1b9e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b9f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1ba00 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1ba10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1ba20 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1ba30 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1ba40 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1ba50 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1ba60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1ba70 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1ba80 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1ba90 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1baa0 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1bab0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1bac0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1bad0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1bae0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1baf0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1bb00 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1bb10 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1bb20 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1bb30 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1bb40 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1bb50 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1bb60 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1bb70 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bb80 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1bb90 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1bba0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1bbb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1bbc0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1bbd0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1bbe0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1bbf0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1bc00 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1bc10 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1bc20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1bc30 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1bc40 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1bc50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1bc60 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1bc70 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1bc80 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1bc90 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1bca0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1bcb0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1bcc0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1bcd0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1bce0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1bcf0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1bd00 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1bd10 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1bd20 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1bd30 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1bd40 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1bd50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bd60 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1bd70 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1bd80 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1bd90 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1bda0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1bdb0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1bdc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1bdd0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1bde0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bdf0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1be00 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1be10 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1be20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1be30 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1be40 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1be50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1be60 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1be70 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1be80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1be90 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1bea0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1beb0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1bec0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1bed0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1bee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1bef0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1bf00 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1bf10 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1bf20 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1bf30 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1bf40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bf50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1bf60 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1bf70 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1bf80 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1bf90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1bfa0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1bfb0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1bfc0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1bfd0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1bfe0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1bff0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1c000 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1c010 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1c020 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1c030 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1c040 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1c050 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1c060 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1c070 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c080 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1c090 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1c0a0 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1c0b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1c0c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1c0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c0e0 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1c0f0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
1c100 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c110 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c120 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c130 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1c140 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1c150 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1c160 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1c170 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1c180 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1c190 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1c1a0 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1c1b0 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1c1c0 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1c1d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c1e0 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1c1f0 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1c200 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1c210 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1c220 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1c230 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1c240 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1c250 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1c260 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1c270 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1c280 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1c290 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1c2a0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1c2b0 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1c2c0 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1c2d0 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1c2e0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1c2f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c310 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c320 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1c330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c340 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1c350 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1c360 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1c370 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1c380 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1c390 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1c3a0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1c3b0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1c3c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1c3d0 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1c3e0 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1c3f0 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1c400 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1c410 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1c420 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1c430 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1c440 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1c450 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1c460 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c470 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c490 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1c4a0 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1c4b0 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1c4c0 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1c4d0 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1c4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c4f0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1c500 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1c510 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1c520 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1c530 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1c540 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1c550 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1c560 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c570 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1c580 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1c590 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1c5a0 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1c5b0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c5c0 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1c5d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1c5e0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c5f0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1c600 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
1c610 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1c620 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1c630 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1c640 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23  HANGED,0);.  }.#
1c650 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1c660 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1c670 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1c680 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1c690 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1c6a0 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1c6b0 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1c6c0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1c6d0 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1c6e0 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1c6f0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1c700 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1c710 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1c720 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1c730 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1c740 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1c750 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1c760 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1c770 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1c780 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1c790 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1c7a0 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1c7b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c7c0 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1c7d0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1c7e0 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1c7f0 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1c800 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1c810 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1c820 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1c830 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1c840 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1c850 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1c860 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1c870 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1c880 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1c890 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1c8a0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1c8b0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c8c0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1c8d0 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1c8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c8f0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1c900 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1c910 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1c920 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1c930 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1c940 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c950 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1c960 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c970 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1c980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c990 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1c9a0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1c9b0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1c9c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1c9d0 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1c9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c9f0 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1ca00 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1ca10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ca20 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1ca30 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1ca40 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
1ca50 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20  0]!='\0', 0);.  
1ca60 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1ca70 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1ca80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ca90 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1caa0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1cab0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1cac0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1cad0 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1cae0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1caf0 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1cb00 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1cb10 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1cb20 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1cb30 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1cb40 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1cb50 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1cb60 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1cb70 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1cb80 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   );.  }.  if( is
1cb90 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b  Hot && nPlayback
1cba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1cbb0 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43  log(SQLITE_NOTIC
1cbc0 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
1cbd0 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25  CK, "recovered %
1cbe0 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22  d pages from %s"
1cbf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cc00 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61    nPlayback, pPa
1cc10 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
1cc20 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1cc30 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1cc40 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1cc50 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1cc60 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1cc70 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1cc80 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1cc90 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1cca0 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1ccb0 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1ccc0 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1ccd0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1cce0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1ccf0 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1cd00 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1cd10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cd20 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1cd30 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1cd40 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1cd50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1cd60 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1cd70 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1cd80 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1cd90 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1cda0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1cdb0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1cdc0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1cdd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1cde0 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1cdf0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1ce00 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1ce10 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1ce20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1ce30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1ce50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1ce60 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1ce70 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1ce80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1ce90 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1cea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ceb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cec0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1ced0 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d   *pPg, u32 iFram
1cee0 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  e){.  Pager *pPa
1cef0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1cf00 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
1cf10 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1cf20 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
1cf30 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
1cf40 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
1cf50 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1cf60 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
1cf70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1cf80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1cf90 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   code */.  int p
1cfa0 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1cfb0 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1cfc0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1cfd0 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1cfe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1cff0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1d000 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1d010 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1d020 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e  er->fd) );..#ifn
1d030 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d040 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65  WAL.  if( iFrame
1d050 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1d060 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1d070 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1d080 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1d090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1d0a0 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1d0b0 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20  ->pWal, iFrame, 
1d0c0 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1d0d0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1d0e0 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f  f.  {.    i64 iO
1d0f0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1d100 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1d110 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1d120 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1d130 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1d140 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
1d150 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1d160 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d170 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d190 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1d1a0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1d1b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d1c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1d1d0 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1d1e0 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1d1f0 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1d200 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1d210 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1d220 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1d230 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1d240 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1d250 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1d260 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1d270 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1d280 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1d290 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1d2a0 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1d2b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1d2c0 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1d2d0 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1d2e0 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1d2f0 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1d300 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1d310 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1d320 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1d330 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1d340 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1d350 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1d360 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1d370 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d380 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1d390 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1d3a0 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1d3b0 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1d3c0 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1d3d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d3e0 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1d3f0 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1d400 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1d410 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
1d420 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1d430 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1d440 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1d450 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1d460 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1d470 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1d480 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1d490 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1d4a0 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1d4b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1d4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4d0 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1d4e0 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1d4f0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1d500 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1d510 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1d520 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1d530 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d540 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1d550 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1d560 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1d570 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1d580 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
1d590 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1d5a0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1d5b0 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1d5c0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1d5d0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1d5e0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1d5f0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
1d600 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1d610 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1d620 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1d630 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1d640 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1d650 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1d660 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
1d670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1d680 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20  pdate the value 
1d690 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1d6a0 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73  unter at offsets
1d6b0 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a   24 and 92 in.**
1d6c0 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
1d6d0 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69  the sqlite versi
1d6e0 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66  on number at off
1d6f0 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68  set 96..**.** Th
1d700 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69  is is an uncondi
1d710 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20  tional update.  
1d720 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
1d730 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d740 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69  unter().** routi
1d750 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70  ne which only up
1d760 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d770 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20  -counter if the 
1d780 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c  update is actual
1d790 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73  ly.** needed, as
1d7a0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1d7b0 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
1d7c0 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65  eCountDone state
1d7d0 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1d7e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
1d7f0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1d800 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ter(PgHdr *pPg){
1d810 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1d820 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63  unter;..  /* Inc
1d830 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1d840 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1d850 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1d860 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1d870 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
1d880 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
1d890 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d  u8*)pPg->pPager-
1d8a0 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a  >dbFileVers)+1;.
1d8b0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1d8c0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1d8d0 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1d8e0 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  er);..  /* Also 
1d8f0 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
1d900 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1d910 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
1d920 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65  and in.  ** byte
1d930 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74  s 92..95 store t
1d940 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1d950 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1d960 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20  version number. 
1d970 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
1d980 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d990 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d9a0 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
1d9b0 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ter);.  put32bit
1d9c0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1d9d0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
1d9e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
1d9f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1da00 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1da10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1da20 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
1da30 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74   for each page t
1da40 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1da50 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e  been .** written
1da60 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69   into the log fi
1da70 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72  le when a WAL tr
1da80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1da90 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72  led back..** Par
1daa0 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68  ameter iPg is th
1dab0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1dac0 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20   said page. The 
1dad0 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a  pCtx argument .*
1dae0 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  * is actually a 
1daf0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1db00 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  ager structure..
1db10 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50  **.** If page iP
1db20 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  g is present in 
1db30 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68  the cache, and h
1db40 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1db50 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a  g references,.**
1db60 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64   it is discarded
1db70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1db80 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
1db90 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e   more outstandin
1dba0 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c  g.** references,
1dbb0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1dbc0 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72  t is reloaded fr
1dbd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1dbe0 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d   If the.** attem
1dbf0 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e  pt to reload con
1dc00 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1dc10 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
1dc20 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a  ed and fails, .*
1dc30 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
1dc40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
1dc50 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1dc60 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1dc70 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  nt pagerUndoCall
1dc80 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c  back(void *pCtx,
1dc90 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e   Pgno iPg){.  in
1dca0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1dcb0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1dcc0 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74  r = (Pager *)pCt
1dcd0 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  x;.  PgHdr *pPg;
1dce0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1dcf0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1dd00 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  );.  pPg = sqlit
1dd10 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1dd20 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1dd30 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1dd40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1dd50 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1dd60 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1dd70 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1dd80 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1dd90 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20       u32 iFrame 
1dda0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1ddb0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
1ddc0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1ddd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46  , pPg->pgno, &iF
1dde0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
1ddf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1de00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
1de10 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
1de20 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Frame);.      }.
1de30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1de40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1de50 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1de60 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1de70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1de80 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
1de90 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  l(pPg);.    }.  
1dea0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1deb0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1dec0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1ded0 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1dee0 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1def0 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1df00 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1df10 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1df20 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1df30 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1df40 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1df50 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1df60 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1df70 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1df80 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1df90 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1dfa0 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1dfb0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1dfc0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1dfd0 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1dfe0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1dff0 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1e000 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1e010 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1e020 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1e030 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1e040 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1e050 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1e060 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1e070 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1e080 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1e090 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1e0a0 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1e0b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1e0c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e0d0 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1e0e0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1e0f0 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1e100 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e110 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1e120 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1e130 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1e160 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1e170 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1e180 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1e190 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1e1a0 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1e1b0 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1e1c0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1e1d0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1e1e0 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1e1f0 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1e200 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1e210 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1e220 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1e230 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1e240 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1e250 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1e260 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1e270 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1e280 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1e290 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1e2a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e2b0 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1e2c0 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1e2d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1e2e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1e2f0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1e300 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1e310 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1e320 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1e330 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1e340 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1e350 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1e360 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1e370 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1e380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e390 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1e3a0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1e3b0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1e3c0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1e3d0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1e3e0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1e3f0 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1e400 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1e410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e420 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1e430 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1e440 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1e450 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1e460 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1e470 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1e480 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1e490 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1e4a0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1e4b0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1e4c0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1e4d0 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1e4e0 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1e4f0 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1e500 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1e510 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1e520 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1e530 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1e540 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1e550 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1e560 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1e570 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1e580 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1e590 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1e5a0 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1e5b0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1e5c0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1e5d0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1e5e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e5f0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1e600 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e620 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1e630 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1e640 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1e650 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1e660 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1e670 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1e680 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1e6b0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1e6c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e6f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1e700 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e720 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1e730 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69  List */.#if defi
1e740 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1e750 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1e760 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29  ITE_CHECK_PAGES)
1e770 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1e7a0 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a  g over pages */.
1e7b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e7c0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1e7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1e7e0 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1e7f0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1e800 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1e810 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1e820 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1e830 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1e840 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1e850 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1e860 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1e870 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1e880 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1e890 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1e8a0 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1e8b0 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1e8c0 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1e8d0 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1e8e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1e8f0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1e900 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1e910 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1e920 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1e930 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1e940 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1e950 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1e960 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1e970 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1e980 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1e990 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1e9a0 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1e9b0 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1e9c0 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1e9d0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48  gHdr *p;.    PgH
1e9e0 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1e9f0 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1ea00 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1ea10 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1ea20 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1ea30 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1ea40 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1ea50 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1ea60 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1ea70 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1ea80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1ea90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1eaa0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1eab0 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1eac0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1ead0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1eae0 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1eaf0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1eb00 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1eb10 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1eb20 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1eb30 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1eb40 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1eb50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1eb60 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1eb70 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1eb80 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1eb90 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1eba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ebb0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1ebc0 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64  ckup ){.    PgHd
1ebd0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1ebe0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1ebf0 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1ec00 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1ec10 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1ec20 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1ec30 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1ec40 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
1ec50 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1ec60 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
1ec70 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1ec80 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1ec90 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
1eca0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1ecb0 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
1ecc0 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
1ecd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1ece0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ecf0 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
1ed00 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1ed10 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
1ed20 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
1ed30 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
1ed40 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
1ed50 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
1ed60 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
1ed70 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
1ed80 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
1ed90 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
1eda0 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
1edb0 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
1edc0 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
1edd0 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
1ede0 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
1edf0 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
1ee00 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
1ee10 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
1ee20 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
1ee30 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
1ee40 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
1ee50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ee60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1ee90 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
1eea0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1eeb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
1eec0 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
1eed0 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
1eee0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1eef0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
1ef00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ef10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
1ef20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1ef30 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1ef40 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
1ef50 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1ef60 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
1ef70 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
1ef80 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
1ef90 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
1efa0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
1efb0 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
1efc0 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
1efd0 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
1efe0 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
1eff0 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
1f000 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
1f010 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
1f020 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
1f030 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1f040 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1f050 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f060 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
1f070 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
1f080 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f090 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
1f0a0 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
1f0b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
1f0c0 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
1f0d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1f0e0 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
1f0f0 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
1f100 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
1f110 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
1f120 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1f130 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f140 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f150 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1f160 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
1f170 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
1f180 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
1f190 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
1f1a0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1f1b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f1c0 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
1f1d0 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
1f1e0 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
1f1f0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1f200 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
1f210 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
1f220 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
1f230 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f240 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1f250 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1f260 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
1f270 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
1f280 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1f290 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
1f2a0 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
1f2b0 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
1f2c0 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1f2d0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
1f2e0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
1f2f0 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
1f300 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1f310 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
1f320 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1f350 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1f360 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
1f370 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1f380 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
1f390 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
1f3a0 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
1f3b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f3c0 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
1f3d0 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
1f3e0 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
1f3f0 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
1f400 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f410 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1f420 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1f430 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
1f440 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1f450 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1f460 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
1f470 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
1f480 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
1f490 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
1f4a0 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
1f4b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f4c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f4d0 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1f4e0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1f4f0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1f500 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  .  nPage = sqlit
1f510 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67  e3WalDbsize(pPag
1f520 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a  er->pWal);..  /*
1f530 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f540 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76   size was not av
1f550 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f560 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1f570 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  .  ** determine 
1f580 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  it based on the 
1f590 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f5a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
1f5b0 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74  e size.  ** of t
1f5c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f5d0 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
1f5e0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
1f5f0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20  he page-size,.  
1f600 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f  ** round down to
1f610 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67   the nearest pag
1f620 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66  e. Except, any f
1f630 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ile larger than 
1f640 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  0.  ** bytes in 
1f650 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72  size is consider
1f660 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74  ed to contain at
1f670 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
1f680 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1f690 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1f6a0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1f6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1f6c0 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1f6d0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1f6e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1f6f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1f700 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1f710 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1f720 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1f730 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1f740 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1f750 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
1f760 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1f7a0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
1f7b0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1f7c0 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
1f7d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
1f7e0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1f7f0 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1f800 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1f810 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1f820 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1f830 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1f840 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1f850 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1f860 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1f870 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1f880 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1f890 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1f8a0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1f8b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1f8c0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1f8d0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1f8e0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1f8f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1f900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f910 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1f920 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1f930 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1f940 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1f950 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1f960 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1f970 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f980 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1f990 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1f9a0 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1f9b0 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1f9c0 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1f9d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f9e0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1f9f0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fa00 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1fa10 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fa20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1fa30 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1fa40 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1fa50 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1fa60 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1fa70 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1fa80 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1fa90 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1faa0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1fab0 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1fac0 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1fad0 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1fae0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1faf0 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1fb00 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1fb10 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1fb20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1fb30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fb40 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1fb50 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1fb60 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1fb70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1fb80 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1fb90 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1fba0 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1fbb0 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1fbc0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1fbd0 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
1fbe0 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
1fbf0 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
1fc00 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
1fc10 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
1fc20 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
1fc30 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1fc40 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1fc50 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
1fc60 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
1fc70 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1fc80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1fc90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fca0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1fcb0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1fcc0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1fcd0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
1fce0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
1fcf0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
1fd00 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
1fd30 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
1fd40 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd60 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
1fd70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1fd80 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
1fd90 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
1fda0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fdb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1fdc0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1fdd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1fde0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
1fdf0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1fe00 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
1fe10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fe20 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
1fe30 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
1fe40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
1fe50 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
1fe60 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1fe70 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
1fe80 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1fe90 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1fea0 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
1feb0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
1fec0 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
1fed0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1fee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fef0 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
1ff00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff10 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1ff20 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
1ff30 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
1ff40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ff50 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1ff60 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
1ff70 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1ff80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1ff90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1ffa0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
1ffb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ffc0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
1ffd0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
1ffe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20000 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20010 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
20020 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
20030 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
20040 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
20050 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
20060 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
20070 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
20080 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
20090 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
200a0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
200b0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
200c0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
200d0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
200e0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
200f0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
20100 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
20110 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
20120 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
20130 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
20140 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
20150 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
20160 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
20170 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
20180 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
20190 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
201a0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
201b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
201c0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
201d0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
201e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
201f0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
20200 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
20210 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
20220 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
20230 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20240 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20250 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
20260 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20270 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
20280 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
20290 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
202a0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
202b0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
202c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
202d0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
202e0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
202f0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
20300 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
20310 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
20320 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
20330 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
20340 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20350 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
20360 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20370 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20380 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
20390 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
203a0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
203b0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
203c0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
203d0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
203e0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
203f0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20400 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
20410 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
20420 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
20430 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
20440 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
20450 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
20460 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
20470 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
20480 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
20490 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
204a0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
204b0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
204c0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
204d0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
204e0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
204f0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
20500 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
20510 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
20520 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
20530 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
20540 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
20550 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
20560 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
20570 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20580 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
20590 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
205a0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
205b0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
205c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
205d0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
205e0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
205f0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
20600 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
20610 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
20620 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
20630 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
20640 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
20650 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
20660 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
20670 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20680 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20690 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
206a0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
206b0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
206c0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
206d0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
206e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
206f0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
20700 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20710 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
20720 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
20730 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
20740 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
20750 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20760 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
20770 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
20780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20790 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
207a0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
207b0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
207c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
207d0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
207e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
207f0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
20800 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
20810 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
20820 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
20830 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
20840 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20850 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
20860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20870 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
20880 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
20890 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
208a0 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
208b0 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
208c0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
208d0 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
208e0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
208f0 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
20900 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
20910 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20920 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
20930 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
20940 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20960 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
20970 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
20980 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
20990 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
209a0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
209b0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
209c0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
209d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
209e0 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
209f0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
20a00 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20a10 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
20a20 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20a30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20a40 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
20a50 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
20a60 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20a70 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
20a80 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
20a90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
20aa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20ab0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
20ac0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20ad0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
20ae0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
20af0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
20b00 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
20b10 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
20b20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b30 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
20b40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20b50 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
20b60 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
20b70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20b80 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
20b90 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
20ba0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
20bb0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
20bc0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
20bd0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
20be0 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
20bf0 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
20c00 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
20c10 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20c20 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20c30 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
20c40 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
20c50 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20c60 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
20c70 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
20c80 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
20c90 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
20ca0 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
20cb0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
20cc0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
20cd0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
20ce0 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
20cf0 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
20d00 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
20d10 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
20d20 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
20d30 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
20d40 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
20d50 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
20d60 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
20d70 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
20d80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
20d90 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
20da0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
20db0 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
20dc0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
20dd0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
20de0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
20df0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
20e00 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
20e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20e30 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
20e40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20e50 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
20e60 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
20e70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
20e80 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
20e90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
20ea0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
20eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
20ec0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20ed0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20ee0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
20ef0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
20f00 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
20f10 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20f20 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
20f30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
20f40 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
20f50 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
20f60 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
20f70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20f80 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
20f90 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
20fa0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
20fb0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
20fc0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
20fd0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
20fe0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
20ff0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21000 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21010 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
21020 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21030 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21040 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
21050 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21060 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21070 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
21080 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21090 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
210a0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
210b0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
210c0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
210d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
210e0 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
210f0 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
21100 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21110 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21120 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21130 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
21140 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
21150 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21160 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21170 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
21180 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
21190 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
211a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
211b0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
211c0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
211d0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
211e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
211f0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21200 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21210 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
21220 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
21230 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
21240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
21250 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21260 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21270 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
21280 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
21290 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
212a0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
212b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
212c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
212d0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
212e0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
212f0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21300 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21310 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21320 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
21330 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21340 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
21350 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21360 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21370 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
21380 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
21390 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
213a0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
213b0 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
213c0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
213d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
213e0 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
213f0 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
21400 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
21410 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21420 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
21430 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21440 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
21450 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21460 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21470 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
21480 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
21490 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
214a0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
214b0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
214c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
214d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
214e0 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
214f0 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
21500 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
21510 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
21520 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
21530 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21540 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21550 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
21560 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
21570 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
21580 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
21590 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
215a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
215b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
215c0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
215d0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
215e0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
215f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21600 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
21610 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21620 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
21630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21640 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
21650 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
21660 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
21670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21680 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21690 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
216a0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
216b0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
216c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
216d0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
216e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
216f0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
21700 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
21710 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
21720 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
21730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
21740 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
21750 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
21760 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
21770 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
21780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
21790 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
217a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
217b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
217c0 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
217d0 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
217e0 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
217f0 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
21800 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
21810 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
21820 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
21830 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
21840 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
21850 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21860 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
21870 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
21880 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
21890 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
218a0 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
218b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
218c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
218d0 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
218e0 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
218f0 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
21900 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21920 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
21930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
21940 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
21950 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
21960 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
21970 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
21980 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
21990 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
219a0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
219b0 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
219c0 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
219d0 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
219e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
219f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21a00 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
21a10 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
21a20 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
21a30 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
21a40 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
21a50 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
21a60 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21a70 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
21a80 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
21a90 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
21aa0 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
21ab0 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
21ac0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
21ad0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
21ae0 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
21af0 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
21b00 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
21b10 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
21b20 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
21b30 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
21b40 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21b50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21b60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21b70 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21b80 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21b90 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21ba0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21bb0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21bc0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21bd0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
21be0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21bf0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
21c00 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
21c10 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
21c20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
21c30 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
21c40 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
21c50 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
21c60 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
21c70 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
21c80 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
21c90 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
21ca0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21cb0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
21cc0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
21cd0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
21ce0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21cf0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
21d00 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
21d10 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
21d20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21d40 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
21d50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
21d60 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
21d70 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
21d80 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
21d90 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21da0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21db0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
21dc0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
21dd0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
21de0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
21df0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21e00 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
21e10 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
21e20 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
21e30 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
21e40 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
21e50 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
21e60 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
21e70 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
21e80 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
21e90 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
21ea0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
21eb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
21ec0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
21ed0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
21ee0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
21ef0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
21f00 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
21f10 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
21f20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
21f30 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
21f40 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
21f50 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
21f60 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
21f70 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
21f80 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
21f90 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
21fa0 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
21fb0 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
21fc0 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
21fd0 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
21fe0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
21ff0 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
22000 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22010 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
22020 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
22030 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
22040 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
22050 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22060 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22070 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
22080 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22090 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
220a0 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
220b0 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
220c0 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
220d0 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
220e0 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
220f0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
22100 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
22110 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
22120 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
22130 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
22140 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
22150 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22160 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22170 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
22180 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
22190 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
221a0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
221b0 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
221c0 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
221d0 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
221e0 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
221f0 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
22200 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
22210 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
22220 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
22230 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
22240 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22250 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22260 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22270 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
22280 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
22290 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
222a0 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
222b0 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
222c0 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
222d0 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
222e0 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
222f0 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
22300 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
22310 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
22320 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
22330 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
22340 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
22350 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22360 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22370 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22380 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22390 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
223a0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
223b0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
223c0 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
223d0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
223e0 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
223f0 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
22400 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
22410 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
22420 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
22430 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
22440 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
22450 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
22460 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22470 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
22480 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
22490 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
224a0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
224b0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
224c0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
224d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
224e0 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
224f0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22500 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22510 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22520 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22530 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22540 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22550 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22560 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22570 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
22580 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22590 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
225a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
225b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
225c0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
225d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
225e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
225f0 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22600 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22610 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22620 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22630 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22640 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22650 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22660 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22670 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22680 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22690 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
226a0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
226b0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
226c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
226d0 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
226e0 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
226f0 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22700 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22710 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22720 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22730 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
22740 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
22750 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22760 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
22770 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22780 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22790 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
227a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
227b0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
227c0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
227d0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
227e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
227f0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
22800 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
22810 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
22820 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
22830 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
22840 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
22850 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
22860 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
22870 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22880 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
22890 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
228a0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
228b0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
228c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
228d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
228e0 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
228f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22900 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
22910 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22920 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
22930 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
22940 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
22950 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
22960 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22970 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
22980 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
22990 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
229a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
229b0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
229c0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
229d0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
229e0 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
229f0 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
22a00 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
22a10 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22a20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22a30 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
22a40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22a50 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
22a60 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22a70 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22a80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22a90 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
22aa0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
22ab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22ac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22ad0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22ae0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22af0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
22b00 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22b10 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
22b20 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
22b30 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
22b40 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
22b50 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
22b60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22b70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22b80 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
22b90 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
22ba0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22bb0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
22bc0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22bd0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
22be0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
22bf0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
22c00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
22c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
22c20 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
22c30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22c40 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
22c50 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22c60 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
22c70 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
22c80 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
22c90 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
22ca0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22cb0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
22cc0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
22cd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22ce0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
22cf0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
22d00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
22d10 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
22d20 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
22d30 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
22d40 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
22d50 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
22d60 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
22d70 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
22d80 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
22d90 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
22da0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
22db0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
22dc0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
22dd0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
22de0 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
22df0 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
22e00 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
22e10 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
22e20 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
22e30 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
22e40 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
22e50 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
22e60 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
22e70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
22e80 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
22e90 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
22ec0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
22ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
22f10 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
22f20 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
22f30 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
22f40 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
22f50 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
22f60 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
22f70 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
22f80 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
22f90 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
22fa0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
22fb0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
22fc0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
22fd0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
22fe0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
22ff0 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23000 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23010 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23020 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23030 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23040 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23050 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23060 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23070 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23080 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23090 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
230a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
230b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
230c0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
230d0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
230e0 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
230f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23100 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23110 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23120 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23130 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23140 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23150 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23160 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23170 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23180 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23190 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
231a0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
231b0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
231c0 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
231d0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
231e0 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
231f0 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23200 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23210 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23220 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23230 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23240 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23250 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23260 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23270 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23280 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23290 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
232a0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
232b0 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
232c0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
232d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
232e0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
232f0 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23300 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23310 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23320 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
23330 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
23340 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
23350 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23360 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23370 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
23380 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
23390 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
233a0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
233b0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
233c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
233d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
233e0 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
233f0 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23400 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23410 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
23420 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23430 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
23440 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
23450 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23460 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23470 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
23480 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
23490 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
234a0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
234b0 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
234c0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
234d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
234e0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
234f0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23500 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23510 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
23520 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
23530 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
23540 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23550 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23560 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23570 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
23580 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
23590 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
235a0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
235b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
235c0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
235d0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
235e0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
235f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23600 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23610 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
23620 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
23630 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
23640 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
23650 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23660 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23670 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23680 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23690 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
236a0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
236b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
236c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
236d0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
236e0 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
236f0 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23700 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23710 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
23720 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
23730 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23740 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
23750 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
23760 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
23770 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23780 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23790 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
237a0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
237b0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
237c0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
237d0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
237e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
237f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23800 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
23810 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
23820 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
23830 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
23840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23850 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
23860 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
23870 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
23880 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
23890 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
238a0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
238b0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
238c0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
238d0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
238e0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
238f0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
23900 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
23910 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
23920 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
23930 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
23940 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
23950 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
23960 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
23970 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
23980 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23990 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
239a0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
239b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
239c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
239d0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
239e0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
239f0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
23a00 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
23a10 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
23a20 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
23a30 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
23a40 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
23a50 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
23a60 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
23a70 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
23a80 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
23a90 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
23aa0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
23ab0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
23ac0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23ad0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
23ae0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
23af0 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
23b00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
23b10 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
23b20 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
23b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
23b40 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
23b50 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
23b60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23b70 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
23b80 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
23b90 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23bb0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23bc0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
23bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23bf0 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
23c00 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
23c10 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
23c20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
23c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
23c40 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
23c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23c60 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
23c70 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
23c80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23c90 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
23ca0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
23cb0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
23cc0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 72   = pNew;.      r
23cd0 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
23ce0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
23cf0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
23d00 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
23d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
23d30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
23d40 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
23d50 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
23d60 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
23d70 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
23d80 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  eSize;.    }.  }
23d90 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
23da0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23db0 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
23dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
23dd0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
23de0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
23df0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
23e00 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
23e10 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
23e20 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
23e30 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
23e40 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
23e50 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
23e60 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
23e70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
23e80 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
23e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23ea0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
23eb0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
23ec0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
23ed0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
23ee0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
23ef0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
23f00 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
23f10 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
23f20 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
23f30 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
23f40 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
23f50 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
23f60 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
23f70 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
23f80 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
23f90 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
23fa0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
23fb0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
23fc0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
23fd0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
23fe0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
23ff0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
24000 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
24010 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
24020 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
24030 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
24040 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
24050 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
24060 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
24070 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
24080 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
24090 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
240a0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
240b0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
240c0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
240d0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
240e0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
240f0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
24100 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
24110 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
24120 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
24130 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
24140 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
24150 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
24160 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
24170 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24180 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
24190 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
241a0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
241b0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
241c0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
241d0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
241e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
241f0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
24200 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
24210 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
24220 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
24230 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
24240 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
24250 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
24260 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
24270 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
24280 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
24290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
242a0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
242b0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
242c0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
242d0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
242e0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
242f0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
24300 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
24310 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
24320 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
24330 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
24340 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
24350 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
24360 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
24370 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
24380 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
24390 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
243a0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
243b0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
243c0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
243d0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
243e0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
243f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24400 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
24410 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
24420 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
24430 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24440 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
24450 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
24460 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24470 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
24480 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
24490 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
244a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
244b0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
244c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
244d0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
244e0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
244f0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
24500 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24510 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
24520 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24530 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
24540 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
24550 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
24560 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
24570 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
24580 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
24590 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
245a0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
245b0 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
245c0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
245d0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
245e0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
245f0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
24600 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
24610 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
24620 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
24630 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
24640 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24650 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
24660 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
24670 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
24680 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
24690 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
246a0 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
246b0 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
246c0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
246d0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
246e0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
246f0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
24700 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
24710 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
24720 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
24730 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
24740 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
24750 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
24760 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
24770 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
24780 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
24790 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
247a0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
247b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
247c0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
247d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
247e0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
247f0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
24800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24810 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
24820 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
24830 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24840 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
24850 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
24860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24870 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
24880 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
24890 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
248a0 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
248b0 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
248c0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
248d0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
248e0 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
248f0 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
24900 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
24910 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
24920 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
24930 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
24940 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
24950 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
24960 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
24970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24980 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
24990 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
249a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
249b0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
249c0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
249d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
249e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
249f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24a00 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
24a10 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
24a20 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
24a30 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
24a40 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
24a50 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
24a60 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
24a70 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
24a80 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
24a90 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
24aa0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
24ab0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
24ac0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
24ad0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
24ae0 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
24af0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
24b00 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24b10 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
24b20 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
24b30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24b40 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
24b50 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
24b60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24b70 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
24b80 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
24b90 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
24ba0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
24bb0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
24bc0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
24bd0 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
24be0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24bf0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
24c00 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
24c10 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
24c20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
24c30 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
24c40 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
24c50 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
24c60 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
24c70 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
24c80 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24c90 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
24ca0 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
24cb0 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
24cc0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
24cd0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
24ce0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
24cf0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
24d00 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24d10 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
24d20 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
24d30 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
24d40 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
24d50 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
24d60 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
24d70 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
24d80 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
24d90 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
24da0 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
24db0 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
24dc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
24dd0 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
24de0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
24df0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
24e00 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24e10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24e20 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
24e30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24e40 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
24e50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24e80 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
24e90 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
24ea0 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
24eb0 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
24ec0 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
24ed0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29  ** already held)
24ee0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
24ef0 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74  transitions that
24f00 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
24f10 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
24f20 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
24f30 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
24f40 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
24f50 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
24f60 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
24f70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
24f80 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
24f90 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
24fa0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
24fb0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
24fc0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
24fd0 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
24fe0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
24ff0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
25000 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
25010 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
25020 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
25030 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
25040 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
25050 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
25060 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
25070 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
25080 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
25090 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
250a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
250b0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
250c0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
250d0 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
250e0 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
250f0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
25100 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
25110 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
25120 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
25130 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
25140 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
25150 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
25160 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
25170 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
25180 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
25190 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
251a0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
251b0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
251c0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
251d0 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
251e0 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
251f0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
25200 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
25210 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
25220 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
25230 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
25240 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
25250 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
25260 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
25270 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
25280 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
25290 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
252a0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
252b0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
252c0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
252d0 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
252e0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
252f0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
25300 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
25310 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
25320 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
25330 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
25340 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
25350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25360 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
25370 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
25380 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
25390 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
253a0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
253b0 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20   behavior would 
253c0 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
253d0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
253e0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
253f0 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
25400 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
25410 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
25420 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
25430 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
25440 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
25450 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
25460 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
25470 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
25480 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
25490 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
254a0 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
254b0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
254c0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
254d0 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
254e0 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
254f0 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
25500 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
25510 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
25520 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
25530 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
25540 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25550 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
25560 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
25570 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
25580 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
25590 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
255a0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
255b0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
255c0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
255d0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
255e0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
255f0 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
25600 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
25610 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
25620 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
25630 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
25640 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
25650 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
25660 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
25670 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
25680 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
25690 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
256a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
256b0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
256c0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
256d0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
256e0 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
256f0 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
25700 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
25710 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
25720 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
25730 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
25740 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
25750 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
25760 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
25770 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
25780 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
25790 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
257a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
257b0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
257c0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
257d0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
257e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63  nsaction..** Onc
257f0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
25800 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
25810 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
25820 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a   must either be.
25830 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ** rolled back o
25840 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20  r committed. It 
25850 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63  is not safe to c
25860 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
25870 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f  n and.** then co
25880 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74  ntinue writing t
25890 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
258a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
258b0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
258c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
258d0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
258e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
258f0 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
25900 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25910 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
25920 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
25930 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
25940 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20  Size = nPage;.. 
25950 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
25960 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63   the code here c
25970 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e  alled assertTrun
25980 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
25990 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
259a0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62  that all pages b
259b0 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61  eing truncated a
259c0 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72  way by this oper
259d0 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20  ation are,.  ** 
259e0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  if one or more s
259f0 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70  avepoints are op
25a00 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74  en, present in t
25a10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
25a20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ** journal so th
25a30 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
25a40 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73  estored if the s
25a50 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
25a60 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68  ed.  ** back. Th
25a70 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
25a80 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69  necessary as thi
25a90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
25aa0 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c  w only.  ** call
25ab0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
25ac0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
25ad0 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74  nsaction. So alt
25ae0 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20  hough the .  ** 
25af0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79  Pager object may
25b00 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e   still have open
25b10 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67   savepoints (Pag
25b20 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30  er.nSavepoint!=0
25b30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  ), .  ** they ca
25b40 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
25b50 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65  ack. So the asse
25b60 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25b70 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a  aint() call.  **
25b80 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
25b90 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  rrect. */.}.../*
25ba0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25bb0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
25bc0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
25bd0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
25be0 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
25bf0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
25c00 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
25c10 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
25c20 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
25c30 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
25c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
25c50 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
25c60 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
25c70 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
25c80 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
25c90 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
25ca0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
25cb0 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
25cc0 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
25cd0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
25ce0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
25cf0 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
25d00 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
25d10 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
25d20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
25d30 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
25d40 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
25d50 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
25d60 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
25d70 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
25d80 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
25d90 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
25da0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
25db0 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
25dc0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
25dd0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
25de0 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
25df0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
25e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25e10 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
25e20 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25e30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25e40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
25e50 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
25e60 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25e70 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
25e80 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
25e90 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
25ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25eb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
25ec0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
25ed0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
25ee0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25ef0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
25f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62   rc;.}../*.** Ob
25f10 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
25f20 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
25f30 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
25f40 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
25f50 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
25f60 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
25f70 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
25f80 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
25f90 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
25fa0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
25fb0 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
25fc0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
25fd0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
25fe0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
25ff0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
26000 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
26010 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
26020 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
26030 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
26040 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
26050 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
26060 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
26070 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
26080 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
26090 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
260a0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
260b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
260c0 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
260d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
26100 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
26130 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
26140 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
26150 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
26160 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
26170 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
26180 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261a0 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
261b0 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
261c0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
261f0 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
26200 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  rn */..  if( pPa
26210 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26220 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
26230 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
26240 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
26250 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
26260 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
26270 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
26280 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  rty = 0;.    mem
26290 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
262a0 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
262b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
262c0 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
262d0 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
262e0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
262f0 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
26300 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
26310 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
26320 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
26330 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
26340 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
26350 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26360 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
26370 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
26390 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
263a0 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
263b0 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
263c0 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
263d0 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
263e0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
263f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
26400 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
26410 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
26420 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
26430 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
26440 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
26450 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26460 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
26470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
26480 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
26490 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
264a0 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
264b0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
264c0 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
264d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
264e0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
264f0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
26500 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
26510 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
26520 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
26530 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
26540 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
26550 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26560 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26570 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
26580 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26590 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
265a0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
265b0 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
265c0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
265d0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
265e0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
265f0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
26600 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
26610 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
26620 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
26630 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26640 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26650 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
26660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26670 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
26680 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
26690 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
266a0 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
266b0 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
266c0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
266d0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
266e0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
266f0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
26700 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
26710 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
26720 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
26730 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
26740 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
26750 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
26760 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
26770 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
26780 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
26790 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
267a0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
267b0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
267c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
267d0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
267e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
267f0 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
26800 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
26810 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
26820 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
26830 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
26840 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
26850 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
26860 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
26870 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
26880 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
26890 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
268a0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
268b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
268c0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
268d0 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
268e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
268f0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
26900 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
26910 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
26920 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
26930 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
26940 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
26950 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
26960 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
26970 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
26980 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
26990 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
269a0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
269b0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
269c0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
269d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
269e0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
269f0 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
26a00 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
26a10 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
26a20 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
26a30 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
26a40 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
26a50 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
26a60 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
26a70 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
26a80 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
26a90 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
26aa0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
26ab0 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
26ac0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
26ad0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
26ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
26af0 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
26b00 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
26b10 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
26b20 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
26b30 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a  ageSize, pTmp);.
26b40 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
26b50 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
26b60 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
26b70 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
26b80 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
26b90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
26ba0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
26bb0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
26bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26bd0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
26be0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
26bf0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
26c00 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
26c10 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
26c20 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
26c30 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
26c40 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
26c50 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
26c60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
26c70 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
26c80 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
26c90 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
26ca0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
26cb0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
26cc0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
26cd0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
26ce0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
26cf0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
26d00 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
26d10 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
26d20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
26d30 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
26d40 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
26d50 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
26d60 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
26d70 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
26d80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
26d90 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
26da0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
26db0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
26dc0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
26dd0 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
26de0 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
26df0 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
26e00 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
26e10 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
26e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26e30 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
26e40 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
26e50 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
26e60 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
26e70 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
26e80 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
26e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
26ea0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
26eb0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
26ec0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
26ed0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
26ee0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
26ef0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
26f00 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
26f10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26f20 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
26f30 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
26f40 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
26f50 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
26f60 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
26f70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
26f80 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
26f90 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
26fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
26fb0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
26fc0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
26fd0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
26fe0 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
26ff0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
27000 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27010 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
27020 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
27030 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
27040 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
27050 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
27060 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
27070 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27080 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
27090 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
270a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
270b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
270c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
270d0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
270e0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
270f0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
27100 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
27110 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
27120 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
27130 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
27140 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
27150 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
27160 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
27170 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
27180 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
27190 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
271a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
271b0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
271c0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
271d0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
271e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
271f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
27200 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
27210 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
27220 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
27230 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
27240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
27250 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
27260 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
27270 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
27280 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
27290 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
272a0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
272b0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
272c0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
272d0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
272e0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
272f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27300 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
27310 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
27320 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
27330 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
27340 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
27350 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
27360 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
27370 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
27380 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
27390 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
273a0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
273b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
273c0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
273d0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
273e0 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
273f0 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
27400 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27410 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
27420 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
27430 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
27440 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
27450 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
27460 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
27470 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
27480 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
27490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
274a0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
274b0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
274c0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
274d0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
274e0 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
274f0 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
27500 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
27510 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27520 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
27530 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
27540 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
27550 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
27560 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
27570 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
27580 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
27590 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
275a0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
275b0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
275c0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
275d0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
275e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
275f0 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
27600 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
27610 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
27620 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
27630 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
27640 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
27650 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
27660 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
27670 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
27680 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
27690 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
276a0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
276b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
276c0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
276d0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
276e0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
276f0 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
27700 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
27710 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
27720 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
27730 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
27740 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
27750 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
27760 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
27770 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
27780 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
27790 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
277a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
277b0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
277c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
277f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27800 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
27810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
27820 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
27830 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
27840 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
27850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
27860 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
27870 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
27880 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
27890 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
278a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
278b0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
278c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
278d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
278e0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
278f0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
27900 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
27910 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
27920 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
27930 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27940 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
27950 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
27960 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
27970 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
27980 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
27990 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
279a0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
279b0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
279c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
279d0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
279e0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
279f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
27a00 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
27a10 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
27a20 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
27a30 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
27a40 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
27a50 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
27a60 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
27a70 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
27a80 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
27a90 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
27aa0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
27ab0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
27ac0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
27ad0 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
27ae0 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
27af0 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
27b00 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
27b10 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
27b20 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
27b30 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
27b40 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
27b50 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
27b60 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
27b70 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
27b80 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
27b90 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
27ba0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
27bb0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
27bc0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
27bd0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
27be0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
27bf0 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27c00 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
27c10 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
27c20 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
27c30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27c40 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
27c50 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
27c60 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
27c70 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
27c80 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
27c90 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
27ca0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
27cb0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
27cc0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27cd0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
27ce0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
27cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
27d00 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
27d10 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
27d20 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
27d30 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
27d40 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
27d50 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
27d60 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
27d70 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
27d80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27d90 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
27da0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
27db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
27dc0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
27dd0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
27de0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
27df0 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
27e00 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
27e10 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
27e20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
27e30 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
27e40 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
27e50 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
27e60 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
27e70 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
27e80 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
27e90 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
27ea0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
27eb0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
27ec0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
27ed0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
27ee0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
27ef0 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
27f00 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
27f10 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
27f20 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
27f30 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
27f40 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
27f50 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
27f60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
27f70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27f80 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
27f90 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
27fa0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
27fb0 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
27fc0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
27fd0 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
27fe0 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
27ff0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28000 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
28010 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
28020 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
28030 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28040 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
28050 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
28060 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
28070 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
28080 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
28090 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
280a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
280b0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
280c0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
280d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
280e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
280f0 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
28100 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28110 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
28120 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
28130 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
28140 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28150 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28160 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
28170 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
28180 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28190 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
281a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
281b0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
281c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
281d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
281e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
281f0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28200 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
28210 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
28220 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
28230 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
28240 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
28250 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
28260 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
28270 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
28280 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
28290 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
282a0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
282b0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
282c0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
282d0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
282e0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
282f0 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
28300 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
28310 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
28320 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
28330 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
28340 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28350 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
28360 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
28370 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
28380 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
28390 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
283a0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
283b0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
283c0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
283d0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
283e0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
283f0 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
28400 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
28410 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
28420 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28430 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
28440 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
28450 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28460 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
28470 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
28480 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28490 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
284a0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
284b0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
284c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
284d0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
284e0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
284f0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28500 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
28510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28520 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28530 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28560 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
28580 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
28590 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
285a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
285b0 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
285c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
285d0 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
285e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
285f0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
28600 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
28610 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
28620 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28640 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
28660 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28670 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28680 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
28690 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
286a0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
286b0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
286c0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
286d0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
286e0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
286f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
28700 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
28710 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
28720 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
28730 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
28740 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
28750 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
28760 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
28770 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
28780 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28790 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
287a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
287b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
287c0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
287d0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
287e0 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
287f0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28800 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
28810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
28820 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
28830 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
28840 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
28850 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28860 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28870 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
28890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
288a0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
288b0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
288c0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
288d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
288e0 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
288f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
28900 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
28910 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
28920 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
28930 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
28940 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
28950 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
28960 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
28970 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
28980 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
28990 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
289a0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
289b0 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
289c0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
289d0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
289e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
289f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28a00 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
28a10 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
28a20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
28a30 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
28a40 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
28a50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
28a60 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
28a70 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
28a80 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
28a90 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
28aa0 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
28ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
28ac0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
28ad0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
28ae0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
28af0 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
28b00 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
28b10 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
28b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
28b30 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
28b40 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
28b50 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
28b60 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
28b70 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
28b80 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
28b90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28ba0 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
28bb0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
28bc0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
28bd0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
28be0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
28bf0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
28c00 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
28c10 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
28c20 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
28c30 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
28c40 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
28c50 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
28c60 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
28c70 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
28c80 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
28c90 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
28ca0 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
28cb0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
28cc0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
28cd0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
28ce0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
28cf0 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
28d00 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
28d10 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
28d20 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
28d30 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
28d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28d50 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
28d60 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
28d70 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
28d80 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
28d90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
28da0 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
28db0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
28dc0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
28dd0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
28de0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
28df0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
28e00 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
28e10 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
28e20 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
28e30 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
28e40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28e50 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
28e60 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
28e70 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
28e80 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
28e90 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
28ea0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
28eb0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
28ec0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
28ed0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
28ee0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
28ef0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
28f00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28f10 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
28f20 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
28f30 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
28f40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28f50 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
28f60 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
28f70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28f80 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
28f90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
28fa0 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
28fb0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
28fc0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28fd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
28fe0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
28ff0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
29000 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
29010 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29020 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
29030 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29040 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
29050 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
29060 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
29070 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
29080 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
29090 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
290a0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
290b0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
290c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
290d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
290e0 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
290f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
29100 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
29110 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
29120 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
29130 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
29140 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
29150 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
29160 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
29170 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
29180 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29190 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
291a0 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
291b0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
291c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
291d0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
291e0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
291f0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29200 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
29210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
29220 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
29230 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
29240 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
29250 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
29260 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
29270 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
29280 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
29290 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
292a0 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
292b0 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
292c0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
292d0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
292e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
292f0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
29300 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
29310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29320 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
29330 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
29340 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
29350 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
29360 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
29370 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29380 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
29390 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
293a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
293b0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
293c0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
293d0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
293e0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
293f0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29400 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29410 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29420 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29430 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29440 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29450 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29460 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
29470 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
29480 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
29490 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
294a0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
294b0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
294c0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
294d0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
294e0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
294f0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29500 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29510 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29520 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29530 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29540 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29550 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
29560 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
29570 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
29580 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
29590 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
295a0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
295b0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
295c0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
295d0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
295e0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
295f0 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29600 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29610 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29620 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29630 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29640 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29650 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
29660 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
29670 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
29680 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
29690 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
296a0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
296b0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
296c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296e0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
296f0 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
29700 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
29710 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
29720 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
29730 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
29740 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
29750 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
29760 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
29770 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
29780 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
29790 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
297a0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
297b0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
297c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
297d0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
297e0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
297f0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
29800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29810 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
29820 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
29830 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
29840 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
29850 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
29860 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
29870 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
29880 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
29890 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
298a0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
298b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
298c0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
298d0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
298e0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
298f0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29900 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
29910 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
29920 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
29930 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29940 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
29950 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
29960 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
29970 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
29980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29990 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
299a0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
299b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
299c0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
299d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
299e0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
299f0 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
29a00 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
29a10 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
29a20 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
29a30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
29a40 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
29a50 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
29a60 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
29a70 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
29a80 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
29a90 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
29aa0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
29ab0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
29ac0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29ad0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
29ae0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
29af0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
29b00 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
29b10 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
29b20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29b30 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
29b40 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
29b50 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
29b60 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
29b70 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
29b80 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
29b90 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
29ba0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
29bb0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
29bc0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
29bd0 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
29be0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
29bf0 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
29c00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29c10 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
29c20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29c30 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
29c40 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
29c50 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
29c60 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
29c70 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
29c80 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
29c90 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
29ca0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
29cb0 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
29cc0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
29cd0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29ce0 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
29cf0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
29d00 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
29d10 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
29d20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
29d30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
29d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29d50 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29d60 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
29d70 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
29d80 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
29d90 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29da0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
29db0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
29dc0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
29dd0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
29de0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
29df0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29e00 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
29e10 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
29e20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29e30 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
29e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29e50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
29e60 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
29e70 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
29e80 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
29e90 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
29ea0 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
29eb0 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
29ec0 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
29ed0 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
29ee0 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
29ef0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
29f00 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
29f10 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
29f20 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
29f30 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
29f40 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
29f50 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
29f60 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
29f70 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
29f80 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
29f90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29fa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
29fb0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
29fc0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
29fd0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
29fe0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
29ff0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
2a000 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
2a010 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
2a020 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
2a030 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
2a040 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
2a050 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
2a060 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
2a070 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
2a080 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2a090 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
2a0a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a0b0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
2a0c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2a0d0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
2a0e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2a0f0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2a100 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
2a110 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2a120 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
2a130 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
2a140 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
2a150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a160 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2a170 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2a180 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2a190 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
2a1a0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
2a1b0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2a1c0 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
2a1d0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
2a1e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a1f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2a200 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
2a210 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
2a220 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20  Pager, pPg) .   
2a230 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
2a240 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
2a250 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
2a260 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2a270 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
2a280 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
2a290 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
2a2a0 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
2a2b0 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
2a2c0 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
2a2d0 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
2a2e0 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
2a2f0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
2a300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a310 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
2a320 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
2a330 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
2a340 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61  ffset = (i64)pPa
2a350 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
2a360 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a370 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
2a380 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20  Data2;.  .      
2a390 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2a3a0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2a3b0 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2a3c0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
2a3d0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2a3e0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2a3f0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2a400 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a410 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2a420 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2a430 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2a440 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2a450 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2a460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a470 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2a480 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2a490 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2a4a0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2a4b0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2a4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a4d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2a4e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2a4f0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2a500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2a510 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2a520 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2a530 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2a540 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2a550 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2a560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2a580 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2a590 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
2a5a0 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
2a5b0 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
2a5c0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
2a5d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2a5e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2a5f0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
2a600 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
2a610 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
2a620 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
2a630 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
2a640 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
2a650 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
2a660 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
2a670 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
2a680 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
2a690 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
2a6a0 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
2a6b0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2a6c0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
2a6d0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
2a6e0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
2a6f0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
2a700 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
2a710 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2a720 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
2a730 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
2a740 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
2a750 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
2a760 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
2a770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a780 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
2a790 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
2a7a0 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
2a7b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
2a7c0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2a7d0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
2a7e0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2a7f0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
2a800 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
2a810 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2a820 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2a830 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2a840 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
2a850 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
2a860 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2a870 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
2a880 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
2a890 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
2a8a0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
2a8b0 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
2a8c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2a8d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2a8e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2a8f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a900 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
2a910 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2a920 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
2a930 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
2a940 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2a950 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
2a960 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
2a970 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2a980 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
2a990 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
2a9a0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
2a9b0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
2a9c0 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    /* The doNotSp
2a9d0 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69  ill NOSYNC bit i
2a9e0 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
2a9f0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
2aa00 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
2aa10 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
2aa20 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
2aa30 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
2aa40 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
2aa50 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
2aa60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2aa70 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
2aa80 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
2aa90 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
2aaa0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
2aab0 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
2aac0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
2aad0 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b  otSpill ROLLBACK
2aae0 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e   and OFF bits in
2aaf0 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
2ab00 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72   spilling.  ** r
2ab10 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2ab20 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79  ther or not a sy
2ab30 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
2ab40 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
2ab50 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  ing.  ** a rollb
2ab60 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72  ack or by user r
2ab70 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69  equest, respecti
2ab80 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  vely..  **.  ** 
2ab90 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
2aba0 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
2abb0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2abc0 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
2abd0 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
2abe0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
2abf0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
2ac00 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
2ac10 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  ation it .  ** i
2ac20 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2ac30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2ac40 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2ac50 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2ac60 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==3.  ** while
2ac70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2ac80 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2ac90 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2aca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2acb0 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2acc0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2acd0 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2ace0 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2acf0 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2ad00 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2ad10 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2ad20 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2ad30 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2ad40 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2ad50 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2ad60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ad70 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2ad80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2ad90 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
2ada0 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63  LBACK );.  testc
2adb0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2adc0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2add0 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73  LAG_OFF );.  tes
2ade0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2adf0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2ae00 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a  LFLAG_NOSYNC );.
2ae10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2ae20 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28  NotSpill.   && (
2ae30 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
2ae40 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47  ill & (SPILLFLAG
2ae50 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46  _ROLLBACK|SPILLF
2ae60 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20  LAG_OFF))!=0.   
2ae70 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
2ae80 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2ae90 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20  YNC)!=0).  ){.  
2aea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aeb0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
2aec0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2aed0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2aee0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2aef0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2af00 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2af10 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2af20 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
2af30 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2af40 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){ .      rc = s
2af50 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2af60 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69  g); .    }.    i
2af70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2af80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2af90 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2afa0 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2afb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2afc0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2afd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2afe0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2aff0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2b000 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b010 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2b020 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2b030 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2b040 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2b050 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2b060 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2b070 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
2b080 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2b090 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
2b0a0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2b0b0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
2b0c0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2b0d0 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
2b0e0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
2b0f0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
2b100 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20  journal..    ** 
2b110 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2b120 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  the call to page
2b130 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2b140 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  () below will no
2b150 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  t.    ** actuall
2b160 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
2b170 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
2b180 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   case..    **.  
2b190 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68    ** Consider th
2b1a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
2b1b0 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a  ence of events:.
2b1c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2b1d0 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20  BEGIN;.    **   
2b1e0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
2b1f0 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d  X>.    **     <m
2b200 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
2b210 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
2b220 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20  NT sp;.    **   
2b230 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
2b240 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
2b250 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ages>.    **    
2b260 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
2b270 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20  age X).    **   
2b280 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
2b290 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
2b2a0 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
2b2b0 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
2b2c0 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
2b2d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
2b2e0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20  tten.    ** out 
2b2f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b300 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
2b310 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
2b320 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
2b330 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2b340 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2b350 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
2b360 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
2b370 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a  will read.    **
2b380 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
2b390 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2b3a0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  is will be the c
2b3b0 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73  opy of page X as
2b3c0 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77   it.    ** was w
2b3d0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
2b3e0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
2b3f0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
2b400 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
2b410 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74     ** was execut
2b420 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
2b430 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
2b440 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
2b450 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
2b460 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
2b470 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  .    ** sub-jour
2b480 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
2b490 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2b4a0 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
2b4b0 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a  at it will.    *
2b4c0 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
2b4d0 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
2b4e0 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
2b4f0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
2b500 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64  .    ** executed
2b510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2b520 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20   NEVER(.        
2b530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b540 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2b550 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
2b560 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2b570 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20  g).    ) ){.    
2b580 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b590 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
2b5a0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2b5b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2b5c0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2b5d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b5e0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2b5f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2b610 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2b620 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2b630 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2b640 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2b650 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2b660 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b670 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2b680 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2b690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b6a0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2b6b0 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2b6c0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2b6d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2b6e0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2b6f0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b700 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2b710 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2b720 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2b730 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
2b740 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2b750 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
2b760 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
2b770 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
2b780 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
2b790 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
2b7a0 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
2b7b0 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
2b7c0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2b7d0 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
2b7e0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
2b7f0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
2b800 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
2b810 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2b820 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
2b830 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
2b840 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
2b850 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2b860 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
2b870 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
2b880 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
2b890 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
2b8a0 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
2b8b0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2b8c0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
2b8d0 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
2b8e0 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
2b8f0 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
2b900 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
2b910 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
2b920 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2b930 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
2b940 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2b950 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
2b960 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2b970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
2b980 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
2b990 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
2b9a0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2b9b0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
2b9c0 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
2b9d0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2b9e0 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
2b9f0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2ba00 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
2ba10 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2ba20 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
2ba30 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2ba40 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2ba50 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2ba60 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2ba70 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2ba80 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2ba90 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2baa0 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2bab0 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2bac0 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2bad0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2bae0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2baf0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2bb00 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2bb10 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2bb20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2bb30 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2bb40 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2bb50 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2bb60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2bb70 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2bb80 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2bb90 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2bba0 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2bbb0 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2bbc0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2bbd0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2bbe0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2bbf0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2bc00 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2bc10 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2bc20 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2bc30 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2bc40 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2bc50 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2bc60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2bc70 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2bc80 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2bc90 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2bca0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2bcb0 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2bcc0 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2bcd0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2bce0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2bcf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2bd00 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2bd10 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2bd20 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2bd30 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2bd40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2bd50 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2bd60 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2bd70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2bd80 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2bd90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2bda0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2bdb0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2bdc0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2bdd0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2bde0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2bdf0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2be00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2be20 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2be30 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2be40 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2be50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2be60 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2be70 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2be80 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2be90 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2bea0 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2beb0 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2bec0 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2bed0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2bee0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2bef0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2bf00 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2bf10 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2bf20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bf30 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2bf40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2bf50 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2bf60 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2bf70 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2bf80 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2bf90 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2bfa0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2bfb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2bfc0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2bfd0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2bfe0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2bff0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2c000 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2c010 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2c020 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2c030 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2c040 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2c050 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2c060 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2c070 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2c080 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2c090 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2c0a0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2c0b0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2c0c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c0d0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2c0e0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2c0f0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2c100 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2c110 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2c120 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2c130 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2c140 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2c150 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2c160 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2c170 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2c180 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2c190 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2c1a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2c1b0 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2c1c0 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2c1d0 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2c1e0 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2c1f0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2c200 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2c210 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c220 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2c230 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2c240 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2c250 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2c260 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2c270 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2c280 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2c290 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2c2a0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2c2b0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2c2c0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
2c2d0 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
2c2e0 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
2c2f0 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
2c300 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2c310 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
2c320 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
2c330 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c340 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
2c350 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
2c360 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
2c370 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
2c380 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
2c390 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
2c3a0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
2c3b0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
2c3c0 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
2c3d0 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
2c3e0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2c3f0 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
2c400 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
2c410 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
2c420 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2c430 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
2c440 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
2c450 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
2c460 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2c470 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2c480 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
2c490 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
2c4a0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2c4b0 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
2c4c0 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
2c4d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2c4e0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2c4f0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2c500 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2c510 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2c520 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c530 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2c540 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2c550 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2c560 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2c570 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2c580 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2c590 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2c5a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2c5b0 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2c5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2c5d0 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2c5e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2c5f0 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2c600 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2c610 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2c620 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2c630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2c640 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2c650 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2c660 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2c670 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2c680 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2c690 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2c6a0 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2c6b0 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2c6c0 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2c6d0 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2c6e0 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2c6f0 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2c700 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2c710 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2c720 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2c730 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c740 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2c750 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2c760 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2c770 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2c780 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2c790 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2c7a0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c7b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c7c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c7d0 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2c7e0 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2c7f0 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2c800 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2c810 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2c820 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2c830 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2c840 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2c850 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2c860 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2c870 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c880 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c890 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2c8a0 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2c8b0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2c8c0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2c8d0 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2c8e0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2c8f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2c900 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2c910 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2c920 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2c930 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2c940 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2c950 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2c960 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c970 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2c980 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2c990 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2c9a0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2c9b0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2c9c0 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2c9d0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2c9e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2c9f0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2ca00 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2ca10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2ca20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2ca30 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2ca40 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2ca50 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2ca60 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2ca70 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2ca80 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2ca90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2caa0 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2cab0 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2cac0 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2cad0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2cae0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2caf0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2cb00 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2cb10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cb20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2cb30 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2cb40 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2cb50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2cb60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2cb70 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2cb80 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2cb90 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2cba0 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2cbb0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2cbc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cbd0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2cbe0 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2cbf0 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2cc00 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2cc10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2cc20 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2cc30 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2cc40 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2cc50 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2cc60 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2cc70 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2cc80 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2cc90 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2cca0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2ccb0 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2ccc0 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2ccd0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2cce0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2ccf0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2cd00 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2cd10 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2cd20 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2cd30 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2cd40 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2cd50 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2cd60 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2cd70 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2cd80 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2cd90 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2cda0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2cdb0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2cdd0 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2cde0 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2cdf0 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2ce00 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2ce10 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2ce20 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2ce30 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2ce40 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2ce50 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2ce60 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2ce70 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2ce80 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2ce90 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2cea0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2ceb0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2cec0 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2ced0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2cee0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2cef0 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2cf00 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2cf10 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2cf20 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2cf30 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2cf40 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2cf50 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2cf60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2cf70 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2cf80 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2cf90 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2cfa0 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2cfb0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2cfc0 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2cfd0 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2cfe0 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2cff0 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2d000 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d010 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d030 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
2d040 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2d050 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2d060 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2d070 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2d080 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2d090 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2d0a0 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2d0b0 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2d0c0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2d0d0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2d0e0 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2d0f0 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2d100 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d110 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2d120 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2d130 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2d140 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2d150 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d160 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2d170 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2d180 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2d190 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2d1a0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2d1b0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2d1c0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2d1d0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2d1e0 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2d1f0 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2d200 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2d210 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2d220 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2d230 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2d240 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2d250 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2d260 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d270 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2d280 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2d290 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2d2a0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2d2b0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d2c0 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d    if( nUri ) mem
2d2d0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69  cpy(&pPager->zFi
2d2e0 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
2d2f0 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  +1], zUri, nUri)
2d300 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d310 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2d320 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d330 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2d340 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2d350 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2d360 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38  -journal\000", 8
2d370 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
2d380 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2d390 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2d3a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
2d3b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2d3c0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50  _OMIT_WAL.    pP
2d3d0 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50  ager->zWal = &pP
2d3e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2d3f0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20  Pathname+8+1];. 
2d400 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d410 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ->zWal, zPathnam
2d420 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d430 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d440 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d  r->zWal[nPathnam
2d450 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20  e], "-wal\000", 
2d460 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
2d470 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2d480 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d490 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23  pPager->zWal);.#
2d4a0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
2d4b0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2d4c0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
2d4d0 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
2d4e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
2d4f0 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
2d500 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2d510 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
2d520 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2d530 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2d540 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
2d550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d560 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2d570 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
2d580 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
2d590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2d5a0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2d5b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d5c0 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
2d5d0 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61  s, &fout);.    a
2d5e0 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b  ssert( !memDb );
2d5f0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2d600 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2d610 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
2d620 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2d630 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2d640 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2d650 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2d660 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2d670 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d680 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2d690 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2d6a0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2d6b0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2d6c0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2d6d0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2d6e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2d6f0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2d700 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2d710 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2d720 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2d730 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2d740 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2d750 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2d760 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2d770 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2d780 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2d790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d7a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2d7b0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2d7c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d7d0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2d7e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61  ;.      if( !rea
2d7f0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
2d800 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2d810 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2d820 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2d830 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2d840 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2d850 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2d860 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
2d870 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2d880 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2d890 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2d8a0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2d8b0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2d8c0 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2d8d0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2d8e0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2d8f0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d900 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IZE;.          }
2d910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d920 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2d930 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2d940 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2d950 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69    }.        }.#i
2d960 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2d970 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2d980 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2d990 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2d9a0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2d9b0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2d9c0 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2d9d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d9e0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2d9f0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2da00 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2da10 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2da20 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2da30 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2da40 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2da50 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2da60 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2da70 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2da80 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2da90 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2daa0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2dab0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2dac0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2dad0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2dae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2daf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
2db00 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
2db10 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2db20 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  k = sqlite3_uri_
2db30 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2db40 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b  e, "nolock", 0);
2db50 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20  .      if( (iDc 
2db60 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49  & SQLITE_IOCAP_I
2db70 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20  MMUTABLE)!=0.   
2db80 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75      || sqlite3_u
2db90 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2dba0 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65  name, "immutable
2dbb0 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
2dbc0 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53     vfsFlags |= S
2dbd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2dbe0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  NLY;.          g
2dbf0 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  oto act_like_tem
2dc00 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  p_file;.      }.
2dc10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2dc20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
2dc30 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
2dc40 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
2dc50 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
2dc60 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
2dc70 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
2dc80 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
2dc90 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
2dca0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
2dcb0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
2dcc0 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
2dcd0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
2dce0 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
2dcf0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2dd00 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
2dd10 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
2dd20 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
2dd30 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
2dd40 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
2dd50 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
2dd60 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
2dd70 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
2dd80 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
2dd90 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
2dda0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ddb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ddc0 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f  This branch also
2ddd0 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20   runs for files 
2dde0 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61  marked as immuta
2ddf0 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74  ble..    */ .act
2de00 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a  _like_temp_file:
2de10 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2de20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2de30 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2de40 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65  ADER;     /* Pre
2de50 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20  tend we already 
2de60 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  have a lock */. 
2de70 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
2de80 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
2de90 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  K;    /* Pretend
2dea0 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55   we are in EXCLU
2deb0 53 49 56 45 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  SIVE locking mod
2dec0 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  e */.    pPager-
2ded0 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20  >noLock = 1;    
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2def0 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  o no locking */.
2df00 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2df10 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2df20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2df30 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2df40 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2df50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2df60 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2df70 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2df80 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2df90 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2dfa0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2dfb0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2dfc0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2dfd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2dfe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2dff0 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2e000 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e010 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2e020 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2e030 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2e040 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2e050 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2e060 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2e070 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2e080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e090 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2e0a0 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2e0b0 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  ;.    nExtra = R
2e0c0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2e0d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e0e0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2e0f0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2e100 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e120 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2e130 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2e140 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2e150 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2e160 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e170 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2e180 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2e190 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2e1a0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2e1b0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2e1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2e1d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2e1e0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2e1f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2e200 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2e210 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e220 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2e230 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e240 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2e250 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2e260 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2e270 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2e280 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2e290 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2e2a0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2e2b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e2c0 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2e2d0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2e2e0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2e2f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2e300 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e310 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2e320 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e330 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2e340 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e350 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2e360 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e370 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2e380 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2e390 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2e3a0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2e3b0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2e3c0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2e3d0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2e3e0 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2e3f0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2e400 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e410 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2e420 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2e430 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2e440 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e450 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2e460 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2e470 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e480 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2e490 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2e4a0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e4b0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2e4c0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2e4d0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e4e0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2e4f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2e500 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2e510 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2e520 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2e530 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2e540 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2e550 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2e560 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2e570 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2e580 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2e590 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e5a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2e5b0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2e5c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2e5d0 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2e5e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e5f0 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  >syncFlags==0 );
2e600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e610 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2e620 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2e630 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  rt( pPager->ckpt
2e640 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2e660 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2e670 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
2e680 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e690 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2e6a0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2e6b0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e6c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2e6d0 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2e6e0 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2e6f0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2e700 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e710 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2e720 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2e730 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e740 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2e750 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e760 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2e770 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2e780 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2e790 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2e7a0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2e7b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2e7c0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2e7d0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2e7e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2e7f0 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2e800 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2e810 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2e820 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2e830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e840 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2e850 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2e860 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2e870 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2e880 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2e890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2e8a0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2e8b0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2e8c0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2e8d0 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2e8e0 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2e8f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2e900 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2e910 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2e920 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2e930 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2e940 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2e950 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2e960 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2e970 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2e980 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2e990 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2e9a0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2e9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e9c0 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2e9d0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2e9e0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2e9f0 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2ea00 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2ea10 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2ea20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2ea30 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2ea40 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2ea50 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2ea60 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2ea70 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2ea80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2ea90 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2eaa0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2eab0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2eac0 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2ead0 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2eae0 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2eaf0 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2eb00 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2eb10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2eb20 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2eb30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2eb40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2eb50 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2eb60 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2eb70 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2eb80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2eb90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2eba0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2ebb0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ebc0 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2ebd0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2ebe0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2ebf0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2ec00 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2ec10 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2ec20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2ec30 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2ec40 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2ec50 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2ec60 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2ec70 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2ec80 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2ec90 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2eca0 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2ecb0 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2ecc0 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2ecd0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2ece0 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2ecf0 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2ed00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2ed10 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2ed20 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2ed30 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2ed40 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2ed50 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2ed60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ed70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ed80 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2ed90 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2eda0 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2edb0 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2edc0 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2edd0 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2ede0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2edf0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2ee00 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2ee10 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2ee20 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2ee30 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2ee40 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2ee50 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2ee60 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2ee70 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2ee80 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2ee90 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2eea0 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2eeb0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2eec0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2eed0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2eee0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2eef0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2ef00 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2ef10 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2ef20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2ef30 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2ef40 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2ef50 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2ef60 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2ef70 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2ef80 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2ef90 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2efa0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2efb0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2efc0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2efd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2efe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2eff0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2f000 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2f010 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2f020 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2f030 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2f040 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2f050 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2f060 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2f070 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2f080 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2f090 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2f0a0 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2f0b0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f0c0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2f0d0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2f0e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f0f0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2f100 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2f110 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f120 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2f130 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2f140 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2f150 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2f160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f170 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f180 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2f190 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f1a0 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2f1b0 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2f1c0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2f1d0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f1e0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2f1f0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2f200 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2f210 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2f220 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2f230 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2f240 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2f250 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2f260 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2f270 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2f280 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2f290 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2f2a0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2f2b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2f2c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f2d0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2f2e0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2f2f0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f300 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f310 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2f320 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2f330 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2f340 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2f350 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f360 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2f370 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2f380 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2f390 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2f3a0 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2f3b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2f3c0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2f3d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2f3e0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2f3f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f400 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f410 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2f420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2f430 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f440 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2f450 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f470 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2f480 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2f490 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2f4a0 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2f4b0 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2f4c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2f4d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2f4e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2f4f0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2f500 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2f510 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2f520 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2f530 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2f540 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f550 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f560 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2f570 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2f580 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2f590 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2f5a0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2f5b0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2f5c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f5d0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2f5e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2f5f0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2f600 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2f610 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2f620 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2f630 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2f640 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2f650 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2f660 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2f670 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2f680 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2f690 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2f6a0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2f6b0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2f6c0 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2f6d0 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2f6e0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2f6f0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2f700 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2f710 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2f720 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2f730 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2f740 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2f750 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2f760 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2f770 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2f780 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2f790 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2f7a0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2f7b0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2f7c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2f7d0 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2f7e0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2f7f0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2f800 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2f810 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2f820 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2f830 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2f840 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2f850 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2f860 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2f870 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2f880 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2f890 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2f8a0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2f8b0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2f8c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f8d0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2f8e0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2f8f0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f910 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2f920 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2f930 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2f940 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2f950 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2f960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f970 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2f980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2f990 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
2f9a0 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
2f9b0 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
2f9c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
2f9d0 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
2f9e0 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
2f9f0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
2fa00 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
2fa10 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
2fa20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fa30 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
2fa40 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
2fa50 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
2fa60 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
2fa70 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
2fa80 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
2fa90 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
2faa0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
2fab0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
2fac0 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
2fad0 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
2fae0 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
2faf0 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
2fb00 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
2fb10 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2fb20 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
2fb30 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
2fb40 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
2fb50 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
2fb60 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
2fb70 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
2fb80 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
2fb90 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2fba0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
2fbb0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2fbc0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
2fbd0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
2fbe0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
2fbf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fc00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2fc10 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
2fc20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2fc30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2fc40 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
2fc50 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
2fc60 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2fc70 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2fc80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
2fca0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
2fcb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fcc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fcd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2fce0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
2fcf0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
2fd00 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
2fd10 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
2fd20 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2fd30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
2fd40 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2fd50 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
2fd60 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
2fd70 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
2fd80 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2fd90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fda0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
2fdb0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
2fdc0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
2fdd0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
2fde0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
2fdf0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
2fe00 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
2fe10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fe20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2fe30 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2fe40 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2fe50 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
2fe60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2fe70 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2fe80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fe90 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2fea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2feb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2fec0 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
2fed0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2fee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
2ff00 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
2ff10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ff20 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
2ff30 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
2ff40 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
2ff50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2ff60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
2ff70 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
2ff80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ff90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ffa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ffb0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2ffc0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2ffd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2ffe0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30000 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
30010 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
30020 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
30030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30040 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
30050 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
30060 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
30070 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
30080 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
30090 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
300a0 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
300b0 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
300c0 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
300d0 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
300e0 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
300f0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
30100 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
30110 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
30120 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
30130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30140 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
30150 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
30160 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
30170 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
30180 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
30190 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
301a0 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
301b0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
301c0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
301d0 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
301e0 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
301f0 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
30200 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
30210 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
30220 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
30230 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
30240 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
30250 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
30260 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
30270 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
30280 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
30290 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
302a0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
302b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
302c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
302d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
302e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
302f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
30300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
30310 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30320 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
30330 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
30340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30350 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
30360 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
30370 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
30380 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73  until after this
30390 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
303a0 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
303b0 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20  ly called. If a 
303c0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61  shared-lock is a
303d0 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e  lready held when
303e0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
303f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
30400 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
30410 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
30420 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61  operations are a
30430 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79  lso performed by
30440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
30450 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68  **.**   1) If th
30460 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
30470 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50  ntly in PAGER_OP
30480 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  EN state (no loc
30490 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
304a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
304b0 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
304c0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
304d0 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
304e0 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
304f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30500 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
30510 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
30520 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
30530 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
30540 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
30550 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
30560 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
30570 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
30580 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
30590 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
305a0 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
305b0 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
305c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
305d0 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
305e0 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
305f0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
30600 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
30610 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
30620 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
30630 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
30640 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
30650 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
30660 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
30670 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
30680 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
30690 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
306a0 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
306b0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
306c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
306d0 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
306e0 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
306f0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
30700 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
30710 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
30720 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
30730 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
30740 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
30750 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30760 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
30770 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
30780 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
30790 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
307a0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
307b0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
307c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
307d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
307e0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
307f0 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
30800 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
30810 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
30820 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  -journal file or
30830 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63   .** rolling bac
30840 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
30850 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
30860 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
30870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30880 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
30890 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
308a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
308b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
308c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
308d0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
308e0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
308f0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
30900 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
30910 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
30920 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
30930 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c  pages. This impl
30940 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ies that the pag
30950 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20  er state should 
30960 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f  either.  ** be O
30970 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52  PEN or READER. R
30980 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f  EADER is only po
30990 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61  ssible if the pa
309a0 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e  ger is or was in
309b0 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65   .  ** exclusive
309c0 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20   access mode..  
309d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
309e0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
309f0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
30a00 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
30a10 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
30a20 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
30a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30a40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30a50 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
30a60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30a70 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20  READER );.  if( 
30a80 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
30a90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
30aa0 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
30ab0 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
30ac0 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
30ad0 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
30ae0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30af0 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
30b00 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
30b10 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
30b20 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
30b30 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
30b40 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
30b50 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
30b60 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
30b70 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
30b80 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
30b90 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
30ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30bb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30bc0 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
30bd0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
30be0 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
30bf0 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   );.      goto f
30c00 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
30c10 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
30c20 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
30c30 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
30c40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
30c50 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30c60 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
30c70 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
30c80 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
30c90 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
30ca0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
30cb0 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  er->eLock<=SHARE
30cc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
30cd0 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
30ce0 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74  al(pPager, &bHot
30cf0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
30d00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
30d20 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30d30 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f  }.    if( bHotJo
30d40 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
30d50 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
30d60 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
30d70 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
30d80 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  NLY_ROLLBACK;.  
30d90 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30da0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
30db0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
30dc0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
30dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30de0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
30df0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
30e00 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
30e10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
30e20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
30e30 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
30e40 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
30e50 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
30e60 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
30e70 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
30e80 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
30e90 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
30ea0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
30eb0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
30ec0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
30ed0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
30ee0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
30ef0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
30f00 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
30f10 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
30f20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
30f30 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
30f40 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
30f50 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
30f60 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
30f70 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
30f80 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
30f90 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
30fa0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
30fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
30fc0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
30fd0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
30fe0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
30ff0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
31000 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
31010 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
31020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31030 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
31040 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
31050 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
31060 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
31070 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
31080 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
31090 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
310a0 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
310b0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
310c0 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
310d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
310e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
310f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
31100 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31120 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31130 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
31140 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
31150 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
31160 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
31170 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
31180 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
31190 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
311a0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
311b0 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
311c0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
311d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
311e0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
311f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
31200 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
31210 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
31220 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
31230 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
31240 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
31250 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
31260 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
31270 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
31280 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
31290 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
312a0 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
312b0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
312c0 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
312d0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
312e0 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
312f0 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
31300 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
31310 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
31320 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
31330 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
31340 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
31350 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
31360 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
31370 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
31380 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
31390 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
313a0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
313b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
313c0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
313d0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
313e0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
313f0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
31400 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
31410 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
31420 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
31430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31440 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
31450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31460 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
31470 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31480 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
31490 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
314a0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
314b0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
314c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
314d0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
314e0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
314f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31500 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
31510 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
31520 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31530 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
31540 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
31550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31570 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
31580 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
31590 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
315a0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
315b0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
315c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
315d0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
315e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
315f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
31600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31610 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
31620 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31630 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
31640 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
31650 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
31660 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
31670 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
316a0 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
316b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
316c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
316d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
316e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
316f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
31700 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
31710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31720 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20     }.      }. . 
31730 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
31740 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
31750 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
31760 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
31770 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
31780 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
31790 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
317a0 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
317b0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
317c0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
317d0 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
317e0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
317f0 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
31800 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
31810 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65  cache.  Sync the
31820 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66   hot journal bef
31830 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20  ore playing.    
31840 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e    ** it back sin
31850 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ce the process t
31860 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20  hat crashed and 
31870 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75  left the hot jou
31880 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72  rnal.      ** pr
31890 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73  obably did not s
318a0 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72  ync it and we ar
318b0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  e required to al
318c0 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20  ways sync.      
318d0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ** the journal b
318e0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74  efore playing it
318f0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   back..      */.
31900 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
31910 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
31920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31940 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
31950 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
31960 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
31970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31990 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
319a0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
319b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
319c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
319d0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20  GER_OPEN;.      
319e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
319f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
31a00 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
31a10 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
31a20 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
31a30 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
31a40 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
31a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31a60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
31a70 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
31a80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
31a90 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
31aa0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
31ab0 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   or roll back a 
31ac0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c  hot-journal whil
31ad0 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
31ae0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
31af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31b00 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  r_unlock() routi
31b10 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
31b20 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
31b30 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20  ng to unlock.   
31b40 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
31b50 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20  . If the unlock 
31b60 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74  attempt fails, t
31b70 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  hen Pager.eLock 
31b80 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20  must be.        
31b90 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  ** set to UNKNOW
31ba0 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20  N_LOCK (see the 
31bb0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
31bc0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20  e #define for . 
31bd0 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57         ** UNKNOW
31be0 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72  N_LOCK above for
31bf0 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29   an explanation)
31c00 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
31c10 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65        ** In orde
31c20 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75  r to get pager_u
31c30 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68  nlock() to do th
31c40 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53  is, set Pager.eS
31c50 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20  tate to.        
31c60 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e  ** PAGER_ERROR n
31c70 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ow. This is not 
31c80 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64  actually counted
31c90 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e   as a transition
31ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45  .        ** to E
31cb0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68  RROR state in th
31cc0 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20  e state diagram 
31cd0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
31ce0 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20  is file,.       
31cf0 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
31d00 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  w that the same 
31d10 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
31d20 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79  lock() will very
31d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72  .        ** shor
31d40 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  tly transition t
31d50 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
31d60 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74  to the OPEN stat
31d70 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20  e. Calling.     
31d80 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67     ** assert_pag
31d90 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64  er_state() would
31da0 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74   fail now, as it
31db0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70   should not be p
31dc0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
31dd0 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f  ** to be in ERRO
31de0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65  R state when the
31df0 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73  re are zero outs
31e00 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20  tanding page .  
31e10 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e        ** referen
31e20 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ces..        */.
31e30 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
31e40 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
31e50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
31e60 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
31e70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
31e80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31e90 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ER_OPEN );.     
31ea0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
31eb0 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
31ec0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  LOCK).          
31ed0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
31ee0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
31ef0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52  ager->eLock>SHAR
31f00 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  ED_LOCK).      )
31f10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
31f20 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31f30 6c 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  le && (.        
31f40 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
31f50 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
31f60 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
31f70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
31f80 3e 30 20 0a 20 20 20 20 20 7c 7c 20 55 53 45 46  >0 .     || USEF
31f90 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20  ETCH(pPager).   
31fa0 20 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68   )){.      /* Th
31fb0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
31fc0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
31fd0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
31fe0 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
31ff0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
32000 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
32010 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
32020 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
32030 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
32040 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
32050 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
32060 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
32070 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
32080 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
32090 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
320a0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
320b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
320c0 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
320d0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
320e0 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
320f0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
32100 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
32110 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
32120 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
32130 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
32140 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
32150 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
32160 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
32170 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
32180 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
32190 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
321a0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
321b0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
321c0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
321d0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
321e0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
321f0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
32200 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
32210 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
32220 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
32230 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
32240 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
32250 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
32260 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
32270 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
32280 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
32290 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
322a0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
322b0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
322c0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d      Pgno nPage =
322d0 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64   0;.      char d
322e0 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
322f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32300 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ers)];..      rc
32310 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
32320 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
32330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32340 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a  ) goto failed;..
32350 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
32360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
32370 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
32380 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
32390 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
323a0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
323b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
323c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
323d0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
323e0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
323f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
32410 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
32420 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
32430 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
32440 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
32450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32460 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
32470 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
32480 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
32490 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
324a0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
324b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
324c0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
324d0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
324e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
324f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
32500 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d  ..        /* Unm
32510 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ap the database 
32520 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73  file. It is poss
32530 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e  ible that extern
32540 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20  al processes.   
32550 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65       ** may have
32560 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64   truncated the d
32570 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
32580 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69   then extended i
32590 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a  t back.        *
325a0 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  * to its origina
325b0 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69  l size while thi
325c0 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f  s process was no
325d0 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
325e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
325f0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32600 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65  may exist a Page
32610 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74  r.pMap mapping t
32620 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20  hat appears.    
32630 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65      ** to be the
32640 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20   right size but 
32650 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
32660 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69  valid. Avoid thi
32670 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  s.        ** pos
32680 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61  sibility by unma
32690 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72  pping the db her
326a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
326b0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
326c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
326d0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
326e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
326f0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
32700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
32710 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
32720 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
32730 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
32740 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
32750 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
32760 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
32770 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
32780 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
32790 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
327a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
327b0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
327c0 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
327d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
327e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
327f0 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
32800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32810 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
32820 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
32830 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
32840 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32850 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
32860 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
32870 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
32880 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
32890 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
328a0 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
328b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
328c0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
328d0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
328e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
328f0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
32900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
32920 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
32930 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
32940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32960 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
32970 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
32980 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32990 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72  _READER;.  }.  r
329a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
329b0 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
329c0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
329d0 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
329e0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
329f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
32a00 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
32a10 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
32a20 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
32a30 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
32a40 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
32a50 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
32a60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
32a70 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
32a80 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
32a90 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
32aa0 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
32ab0 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
32ac0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
32ad0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
32ae0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
32af0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
32b00 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
32b10 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20  >nMmapOut==0 && 
32b20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
32b30 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
32b40 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
32b50 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
32b60 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
32b70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32b80 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
32b90 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
32ba0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
32bb0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
32bc0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
32bd0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
32be0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
32bf0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
32c00 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
32c10 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
32c20 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
32c30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
32c40 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
32c50 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
32c60 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
32c70 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
32c80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
32c90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
32ca0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
32cb0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
32cc0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
32cd0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
32ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32cf0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
32d00 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
32d10 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
32d20 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
32d30 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
32d40 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
32d50 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
32d60 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
32d70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
32d80 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
32d90 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
32da0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
32db0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
32dc0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
32dd0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
32de0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
32df0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
32e00 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
32e10 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
32e20 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
32e30 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
32e40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
32e50 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
32e60 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
32e70 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
32e80 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
32e90 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
32ea0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
32eb0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
32ec0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
32ed0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
32ee0 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
32ef0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
32f00 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
32f10 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
32f20 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
32f30 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
32f40 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
32f50 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
32f60 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
32f70 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
32f80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32f90 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
32fa0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
32fb0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
32fc0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
32fd0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
32fe0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
32ff0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
33000 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
33010 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
33020 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
33030 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e  curs in two scen
33040 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
33050 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
33060 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
33070 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
33080 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
33090 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
330a0 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
330b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
330c0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
330d0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
330e0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
330f0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
33100 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
33110 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
33120 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
33130 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
33140 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
33150 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
33160 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
33170 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
33180 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
33190 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
331a0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
331b0 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
331c0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
331d0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
331e0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
331f0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
33200 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
33210 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
33220 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33230 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33240 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
33250 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
33260 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
33270 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
33280 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
33290 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
332a0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
332b0 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
332c0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
332d0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
332e0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
332f0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
33300 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
33310 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
33320 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
33330 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
33340 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
33350 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
33360 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
33370 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
33380 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
33390 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
333a0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
333b0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
333c0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
333d0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
333e0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
333f0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
33400 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
33410 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
33420 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33430 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
33440 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
33450 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
33460 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
33470 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
33480 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
33490 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
334a0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
334b0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
334c0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
334d0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
334e0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
334f0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
33500 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
33510 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
33520 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
33530 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
33540 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
33550 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
33560 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
33570 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
33580 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
33590 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
335a0 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
335b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
335c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
335d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
335e0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
335f0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
33600 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
33610 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
33620 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
33630 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
33640 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
33650 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
33660 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
33680 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32   *pPg = 0;.  u32
33690 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
336b0 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72  Frame to read fr
336c0 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  om WAL file */. 
336d0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e   const int noCon
336e0 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20  tent = (flags & 
336f0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
33700 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  ENT);..  /* It i
33710 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20  s acceptable to 
33720 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  use a read-only 
33730 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20  (mmap) page for 
33740 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a  any page except.
33750 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74    ** page 1 if t
33760 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65  here is no write
33770 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
33780 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45  n or the ACQUIRE
33790 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66  _READONLY.  ** f
337a0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
337b0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
337c0 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20   And so long as 
337d0 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20  the db is not a 
337e0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
337f0 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
33800 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e  abase.  */.  con
33810 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d  st int bMmapOk =
33820 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 55 53 45   (pgno!=1 && USE
33830 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20  FETCH(pPager).  
33840 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
33850 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33860 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41  R || (flags & PA
33870 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
33880 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  )).#ifdef SQLITE
33890 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
338a0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
338b0 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a  =0.#endif.  );..
338c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
338d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
338e0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
338f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
33900 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
33910 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f  ;.  assert( noCo
33920 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61  ntent==0 || bMma
33930 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  pOk==0 );..  if(
33940 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
33950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33960 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
33970 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
33980 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
33990 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
339a0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
339b0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
339c0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
339d0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
339e0 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
339f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
33a00 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
33a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
33a20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33a30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
33a40 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
33a50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
33a70 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
33a80 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
33a90 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
33aa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33ab0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33ac0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33ad0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
33ae0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
33af0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
33b00 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
33b10 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
33b20 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
33b30 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
33b40 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
33b50 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
33b60 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
33b70 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
33b80 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
33b90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33ba0 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
33bb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
33bc0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
33bd0 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DER ){.         
33be0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
33bf0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
33c00 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
33c10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
33c20 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
33c30 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
33c40 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
33c50 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
33c60 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
33c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33c80 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
33c90 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
33ca0 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67  64)(pgno-1)*pPag
33cb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
33cc0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
33cd0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20          if( pPg 
33ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
33cf0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33d00 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
33d10 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
33d20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
33d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
33d40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33d70 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33d80 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
33d90 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20      }..    {.   
33da0 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68     sqlite3_pcach
33db0 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20  e_page *pBase;. 
33dc0 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c       pBase = sql
33dd0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33de0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33df0 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20   pgno, 3);.     
33e00 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
33e10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33e20 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33e30 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
33e40 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
33e50 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Base);.        i
33e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33e70 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
33e80 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
33e90 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 2a   }.      pPg = *
33ea0 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  ppPage = sqlite3
33eb0 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73  PcacheFetchFinis
33ec0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
33ed0 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b  e, pgno, pBase);
33ee0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
33ef0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
33f00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
33f10 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
33f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
33f30 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  Either the call 
33f40 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
33f50 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64  Fetch() returned
33f60 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65   an error or the
33f70 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61  .    ** pager wa
33f80 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
33f90 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
33fa0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33fb0 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
33fc0 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20  ** Set pPg to 0 
33fd0 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  and jump to the 
33fe0 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65  exception handle
33ff0 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  r.  */.    pPg =
34000 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   0;.    goto pag
34010 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34020 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
34030 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
34040 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
34050 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
34060 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a  er==pPager || (*
34070 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
34080 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70  =0 );..  if( (*p
34090 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26  pPage)->pPager &
340a0 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
340b0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
340c0 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
340d0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
340e0 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
340f0 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
34100 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
34110 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
34120 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
34130 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
34140 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
34150 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
34160 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
34170 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
34180 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
34190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
341a0 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
341b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
341c0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
341d0 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
341e0 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
341f0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
34200 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
34210 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
34220 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
34230 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
34240 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
34250 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
34260 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
34270 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
34280 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
34290 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
342a0 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
342b0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
342c0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
342d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
342e0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
342f0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
34300 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34320 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34330 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
34340 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
34360 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
34370 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
34380 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
34390 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
343a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
343b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
343c0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
343d0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
343e0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
343f0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34410 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
34420 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
34430 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
34440 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
34450 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
34460 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
34470 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
34480 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
34490 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
344a0 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
344b0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
344c0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
344d0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
344e0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
344f0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
34500 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
34510 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
34520 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
34530 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
34540 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
34550 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
34560 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
34570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34580 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
34590 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
345a0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
345b0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
345c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
345d0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
345e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
345f0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34600 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
34610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34620 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34630 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
34640 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
34650 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
34660 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
34670 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
34690 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
346a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
346b0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
346c0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
346d0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
346e0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
346f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34700 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
34710 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
34720 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
34730 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
34740 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34750 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
34760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34770 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
34780 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
34790 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
347a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
347b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
347c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
347d0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
347e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
347f0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34800 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
34810 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
34820 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
34830 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
34840 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
34850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34870 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34880 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34890 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
348a0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
348b0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
348c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
348d0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
348e0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
348f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34900 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
34910 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
34920 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
34930 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
34940 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
34950 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
34960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34970 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
34980 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
34990 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
349a0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
349b0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
349c0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
349d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
349e0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
349f0 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
34a00 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
34a10 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
34a20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34a30 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
34a40 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
34a50 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
34a60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
34a70 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
34a80 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
34a90 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
34aa0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
34ab0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34ac0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
34ad0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
34ae0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
34af0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34b00 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
34b10 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
34b20 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
34b30 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
34b40 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
34b50 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
34b60 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
34b70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
34b80 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
34b90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34ba0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
34bb0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
34bc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
34bd0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
34be0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
34bf0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
34c00 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34c10 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  0);.  return sql
34c20 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34c30 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34c40 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
34c50 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
34c60 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
34c70 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
34c80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
34c90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
34ca0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
34cb0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
34cc0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
34cd0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
34ce0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
34cf0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
34d00 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
34d10 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
34d20 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
34d30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34d40 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
34d50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
34d60 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
34d70 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
34d80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
34d90 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
34da0 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
34db0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
34dc0 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
34dd0 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
34de0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
34df0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
34e00 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
34e10 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
34e20 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
34e30 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
34e40 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
34e50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
34e60 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
34e70 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
34e80 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
34e90 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
34ea0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34eb0 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
34ec0 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
34ed0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
34ee0 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
34ef0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
34f00 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
34f10 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
34f20 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
34f30 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
34f40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
34f50 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
34f60 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
34f70 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
34f80 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
34f90 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
34fa0 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
34fb0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
34fc0 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
34fd0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
34fe0 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
34ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
35000 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
35010 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35020 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
35030 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
35040 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
35050 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
35060 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
35070 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
35080 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
35090 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
350a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
350b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
350c0 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
350d0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
350e0 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
350f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
35100 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
35110 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35120 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35130 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
35140 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
35150 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
35160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35170 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
35180 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
35190 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
351a0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
351b0 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
351c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
351d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
351e0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
351f0 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
35200 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
35210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
35220 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
35230 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
35240 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
35250 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
35260 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
35270 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
35280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
35290 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
352a0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
352b0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
352c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
352d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
352e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35300 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
35310 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
35320 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
35330 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
35340 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
35350 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35360 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35370 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35380 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
35390 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
353a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
353b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
353c0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
353d0 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
353e0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
353f0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
35400 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
35410 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
35420 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
35430 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
35440 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
35450 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
35460 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
35470 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
35480 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
35490 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
354a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
354b0 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
354c0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
354d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
354e0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
354f0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
35500 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35510 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
35520 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
35530 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
35540 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35550 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
35560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35570 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
35580 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
35590 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
355a0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
355b0 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
355c0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
355d0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
355e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
355f0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
35600 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
35610 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
35620 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
35630 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
35640 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35650 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
35660 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
35670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
35680 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
35690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
356a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
356b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
356c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
356d0 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
356e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
356f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
35700 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
35710 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
35720 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
35730 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
35740 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
35750 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
35760 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
35770 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
35780 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
35790 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
357a0 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
357b0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
357c0 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
357d0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
357e0 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
357f0 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
35800 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
35810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35820 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35830 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
35840 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
35850 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
35860 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
35870 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
35880 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35890 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
358a0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
358b0 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
358c0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
358d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
358e0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
358f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35900 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35910 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
35920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
35950 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35960 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
35970 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
35980 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
35990 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
359a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
359b0 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
359c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
359d0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
359e0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
359f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35a00 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
35a10 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
35a20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
35a30 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
35a40 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
35a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35a60 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
35a70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
35a80 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
35a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35aa0 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
35ab0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
35ac0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
35ad0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35af0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35b00 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35b10 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
35b20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35b30 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
35b40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35b50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35b60 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35b70 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
35b80 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35b90 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
35ba0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35bb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
35bc0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
35bd0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
35be0 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
35bf0 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
35c00 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35c10 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
35c20 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
35c30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35c40 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
35c50 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
35c60 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
35c70 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
35c80 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
35c90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35ca0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
35cb0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
35cc0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
35cd0 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
35ce0 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
35cf0 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
35d00 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
35d10 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
35d20 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
35d30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
35d40 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
35d50 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
35d60 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
35d70 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
35d80 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
35d90 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
35da0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
35db0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
35dc0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
35dd0 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
35de0 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
35df0 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
35e00 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
35e10 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
35e20 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
35e30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
35e40 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
35e50 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
35e60 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
35e70 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
35e80 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
35e90 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
35ea0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
35eb0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
35ec0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
35ed0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
35ee0 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
35ef0 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
35f00 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
35f10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35f20 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
35f30 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
35f40 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
35f50 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
35f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
35f70 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
35f80 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
35f90 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
35fa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35fb0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
35fc0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
35fd0 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
35fe0 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
35ff0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
36000 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
36010 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
36020 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36030 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
36040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36050 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
36060 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
36070 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36080 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
36090 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
360a0 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
360b0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
360c0 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
360d0 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
360e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
360f0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
36100 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
36110 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
36120 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36130 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36140 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
36150 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36160 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
36170 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36180 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36190 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
361a0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
361b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
361c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
361d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
361e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
361f0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
36200 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
36210 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36220 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
36230 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
36240 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
36250 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
36260 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
36270 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
36280 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
36290 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
362a0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
362b0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
362c0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
362d0 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
362e0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
362f0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
36300 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
36310 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
36320 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
36330 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
36340 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
36360 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
36370 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
36380 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
36390 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
363a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
363b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
363c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
363d0 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
363e0 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
363f0 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
36400 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
36410 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
36420 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
36430 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
36440 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
36450 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
36460 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
36470 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
36480 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
36490 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
364a0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
364b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
364c0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
364d0 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
364e0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
364f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36500 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
36510 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
36520 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
36530 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
36540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36550 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
36560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36570 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
36580 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
36590 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
365a0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
365b0 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
365c0 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
365d0 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
365e0 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
365f0 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
36600 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
36610 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
36620 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
36630 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
36640 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
36650 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
36660 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
36670 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
36680 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
36690 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
366a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
366b0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
366c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
366d0 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
366e0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
366f0 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
36700 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
36710 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
36720 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36730 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
36740 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
36750 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
36760 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
36770 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36780 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36790 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
367a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
367b0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
367c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
367d0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
367e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
367f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
36800 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36810 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36820 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36830 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
36840 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36850 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36860 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36870 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
36880 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36890 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
368a0 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
368b0 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
368c0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
368d0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
368e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
368f0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
36900 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
36910 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
36920 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
36930 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
36940 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
36950 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
36960 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
36970 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
36980 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
36990 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
369a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
369b0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
369c0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
369d0 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
369e0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
369f0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
36a00 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
36a10 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
36a20 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
36a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36a40 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
36a50 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
36a60 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36a70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
36a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
36a90 6e 74 20 69 6e 4a 6f 75 72 6e 61 6c 3b 0a 0a 20  nt inJournal;.. 
36aa0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
36ab0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
36ac0 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72  nless a write-tr
36ad0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
36ae0 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e  ready .  ** been
36af0 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f   started. The jo
36b00 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
36b10 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
36b20 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  n at this point.
36b30 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  .  ** It is neve
36b40 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  r called in the 
36b50 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a  ERROR state..  *
36b60 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
36b70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36b80 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
36b90 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36ba0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36bb0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
36bc0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36bd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36be0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
36bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
36c00 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36c10 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
36c20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
36c30 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ode==0 );.  asse
36c40 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  rt( pPager->read
36c50 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 43 48  Only==0 );..  CH
36c60 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
36c70 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
36c80 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
36c90 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72  e opened. Higher
36ca0 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
36cb0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
36cc0 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e  * obtained the n
36cd0 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74  ecessary locks t
36ce0 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74  o begin the writ
36cf0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e-transaction, b
36d00 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c  ut the.  ** roll
36d10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
36d20 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
36d30 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  en. Open it now 
36d40 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
36d50 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
36d60 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
36d70 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
36d80 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36d90 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  y() on the page.
36da0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
36db0 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e  , if it were don
36dc0 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  e after calling 
36dd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
36de0 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20  eDirty(), then. 
36df0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67   ** an error mig
36e00 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65  ht occur and the
36e10 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64   pager would end
36e20 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f   up in WRITER_LO
36e30 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20  CKED state.  ** 
36e40 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65  with pages marke
36e50 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68  d as dirty in th
36e60 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  e cache..  */.  
36e70 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
36e80 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36e90 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72  _LOCKED ){.    r
36ea0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
36eb0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
36ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36ed0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
36ee0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
36ef0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
36f00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36f10 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  CHEMOD );.  asse
36f20 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36f30 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36f40 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
36f50 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
36f60 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
36f70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
36f80 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
36f90 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
36fa0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
36fb0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
36fc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
36fd0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
36fe0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 70 61 67 65 49  nJournal = pageI
36ff0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
37000 20 70 50 67 29 3b 0a 20 20 69 66 28 20 69 6e 4a   pPg);.  if( inJ
37010 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
37020 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
37030 20 7c 7c 20 21 73 75 62 6a 52 65 71 75 69 72 65   || !subjRequire
37040 73 50 61 67 65 28 70 50 67 29 29 20 29 7b 0a 20  sPage(pPg)) ){. 
37050 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
37060 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37070 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
37080 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
37090 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
370a0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
370b0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
370c0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
370d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
370e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
370f0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
37100 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
37110 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
37120 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
37130 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
37140 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
37150 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 6e 4a   */.    if( !inJ
37160 6f 75 72 6e 61 6c 20 26 26 20 21 70 61 67 65 72  ournal && !pager
37170 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
37180 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
37190 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
371a0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  er)==0 );.      
371b0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
371c0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
371d0 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
371e0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
371f0 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
37200 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
37210 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34  ta2;.        i64
37220 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
37230 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20  journalOff;..   
37240 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
37250 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
37260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37270 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
37280 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
37290 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
372a0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
372b0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
372c0 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
372d0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
372e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
372f0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
37300 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
37310 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20  ager) );..      
37320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37330 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
37340 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37350 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
37360 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
37370 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37380 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
37390 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
373a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
373b0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
373c0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
373d0 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a2);..        /*
373e0 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
373f0 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
37400 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
37410 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
37420 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
37430 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
37440 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
37450 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
37460 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
37470 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
37480 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
37490 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
374a0 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
374b0 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
374c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
374d0 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
374e0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
374f0 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
37500 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
37510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
37520 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
37530 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
37540 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
37550 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
37560 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
37570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37580 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
37590 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
375a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
375b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
375c0 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
375d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
375e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
375f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37600 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37610 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
37620 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
37630 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37640 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20  e, iOff+4);.    
37650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37660 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37670 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
37680 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
37690 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
376a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
376b0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
376c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
376d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
376e0 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ..        IOTRAC
376f0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
37700 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
37710 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37740 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
37750 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
37760 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
37770 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
37780 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
37790 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
377a0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
377b0 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
377c0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
377d0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
377e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
377f0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
37800 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
37810 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
37820 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
37830 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
37840 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37850 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
37860 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37870 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
37880 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
37890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
378a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
378b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
378c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
378d0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
378e0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
378f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
37900 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
37910 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
37920 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37930 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
37940 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
37950 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
37960 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
37970 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37980 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
37990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
379a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
379b0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
379c0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
379d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
379e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
379f0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
37a00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
37a10 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37a20 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
37a30 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
37a40 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
37a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37a60 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
37a70 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
37a80 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
37aa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
37ab0 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
37ac0 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
37ad0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37ae0 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
37af0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
37b00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
37b10 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37b20 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
37b30 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
37b40 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
37b50 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
37b60 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
37b70 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
37b80 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
37b90 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
37ba0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
37bb0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
37bc0 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
37bd0 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
37be0 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
37bf0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
37c00 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
37c10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
37c20 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
37c30 3e 30 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  >0 && subjRequir
37c40 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
37c50 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
37c60 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
37c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
37c80 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
37c90 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
37ca0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
37cb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
37cc0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
37cd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
37ce0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
37cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37d00 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  *.** This is a v
37d10 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
37d20 33 50 61 67 65 72 57 72 69 74 65 28 29 20 74 68  3PagerWrite() th
37d30 61 74 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  at runs when the
37d40 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20   sector size.** 
37d50 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
37d60 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53  he page size.  S
37d70 51 4c 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20  QLite makes the 
37d80 28 72 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73  (reasonable) ass
37d90 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  umption that.** 
37da0 61 6c 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73  all bytes of a s
37db0 65 63 74 6f 72 20 61 72 65 20 77 72 69 74 74 65  ector are writte
37dc0 6e 20 74 6f 67 65 74 68 65 72 20 62 79 20 68 61  n together by ha
37dd0 72 64 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20  rdware.  Hence, 
37de0 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20  all bytes of.** 
37df0 61 20 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f  a sector need to
37e00 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69   be journalled i
37e10 6e 20 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65  n case of a powe
37e20 72 20 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69  r loss in the mi
37e30 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69  ddle of.** a wri
37e40 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  te..**.** Usuall
37e50 79 2c 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  y, the sector si
37e60 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ze is less than 
37e70 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
37e80 70 61 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68  page size, in wh
37e90 69 63 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65  ich.** case page
37ea0 73 20 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64  s can be individ
37eb0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20  ually written.  
37ec0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
37ed0 79 20 72 75 6e 73 20 69 6e 20 74 68 65 20 65 78  y runs in the ex
37ee0 63 65 70 74 69 6f 6e 61 6c 0a 2a 2a 20 63 61 73  ceptional.** cas
37ef0 65 20 77 68 65 72 65 20 74 68 65 20 70 61 67 65  e where the page
37f00 20 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72   size is smaller
37f10 20 74 68 61 6e 20 74 68 65 20 73 65 63 74 6f 72   than the sector
37f20 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
37f30 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
37f40 20 69 6e 74 20 70 61 67 65 72 57 72 69 74 65 4c   int pagerWriteL
37f50 61 72 67 65 53 65 63 74 6f 72 28 50 67 48 64 72  argeSector(PgHdr
37f60 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
37f70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37f80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
37f90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
37fa0 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
37fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37fc0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
37fd0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
37fe0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
37ff0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
38000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
38010 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
38020 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
38030 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69 6e  ated on. */.  in
38040 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
38050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38060 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
38070 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
38080 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
38090 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
380a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
380b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
380c0 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63  /.  int needSync
380d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
380e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
380f0 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
38100 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20 20  _NEED_SYNC */.  
38110 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38120 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 20 20 2f  pPg->pPager;   /
38130 2a 20 54 68 65 20 70 61 67 65 72 20 74 68 61 74  * The pager that
38140 20 6f 77 6e 73 20 70 50 67 20 2a 2f 0a 20 20 50   owns pPg */.  P
38150 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
38160 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
38170 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
38180 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
38190 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
381a0 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20  pill NOSYNC bit 
381b0 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
381c0 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
381d0 61 6c 6c 6f 77 0a 20 20 2a 2a 20 61 20 6a 6f 75  allow.  ** a jou
381e0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
381f0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
38200 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
38210 6e 61 6c 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  naled by.  ** th
38220 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  is function..  *
38230 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  /.  assert( !MEM
38240 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
38250 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
38260 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
38270 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  NOSYNC)==0 );.  
38280 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
38290 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
382a0 4e 4f 53 59 4e 43 3b 0a 0a 20 20 2f 2a 20 54 68  NOSYNC;..  /* Th
382b0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
382c0 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
382d0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
382e0 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 2a  tor-size are.  *
382f0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
38300 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
38310 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
38320 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
38330 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
38340 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
38350 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
38360 74 65 64 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  ted on..  */.  p
38370 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
38380 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
38390 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
383a0 0a 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20  .  nPageCount = 
383b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
383c0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
383d0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
383e0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
383f0 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
38400 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
38410 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
38420 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
38430 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
38440 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
38450 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 67 65  }else{.    nPage
38460 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
38470 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
38480 6e 50 61 67 65 3e 30 29 3b 0a 20 20 61 73 73 65  nPage>0);.  asse
38490 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
384a0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 28 70 67  o);.  assert((pg
384b0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
384c0 6e 6f 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30  no);..  for(ii=0
384d0 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
384e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
384f0 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 20  +){.    Pgno pg 
38500 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 50 67  = pg1+ii;.    Pg
38510 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
38520 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
38530 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
38540 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
38550 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
38560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 21  ){.      if( pg!
38570 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
38580 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
38590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
385a0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
385b0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
385c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
385d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
385e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
385f0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
38600 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
38610 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
38620 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
38630 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
38640 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
38650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
38660 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
38670 6c 6c 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ll(pPage);.     
38680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
38690 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
386a0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
386b0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
386c0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
386d0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
386e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
386f0 20 29 7b 0a 20 20 20 20 20 20 20