/ Hex Artifact Content
Login

Artifact fe82e368600278cfd35024c20b888e945236f675:


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 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 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: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7930: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7940: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7950: 20 72 65 61 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   read */.  Pgno 
7960: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7980: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7990: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
79a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
79c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
79d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
79e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
79f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7a30: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7a50: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7a60: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7a70: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7a80: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7a90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7aa0: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7ab0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7ac0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7ae0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7af0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7b00: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7b10: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7b30: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7b40: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7b60: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7b90: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7ba0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7bb0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7bd0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7bf0: 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  file */.#ifdef S
7c00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
7c10: 4f 43 4b 45 44 0a 20 20 42 69 74 76 65 63 20 2a  OCKED.  Bitvec *
7c20: 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20  pAllRead;       
7c30: 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61      /* Pages rea
7c40: 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  d within current
7c50: 20 55 4e 4c 4f 43 4b 45 44 20 74 72 61 6e 73 2e   UNLOCKED trans.
7c60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c   */.#endif.  sql
7c70: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
7c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7c90: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7ca0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
7cb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
7cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7cd0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7ce0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
7cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7d00: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
7d10: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7d20: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
7d30: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
7d40: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
7d50: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
7d60: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
7d70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
7d80: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
7d90: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
7da0: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
7db0: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
7dc0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73  al header */.  s
7dd0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
7de0: 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f  Backup;    /* Po
7df0: 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66  inter to list of
7e00: 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20   ongoing backup 
7e10: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50  processes */.  P
7e20: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
7e30: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
7e40: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
7e50: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
7e60: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
7e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e80: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
7e90: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
7ea0: 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56 65  */.  u32 iDataVe
7eb0: 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  rsion;          
7ec0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7ed0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ever database co
7ee0: 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f  ntent changes */
7ef0: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
7f00: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
7f10: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
7f20: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7f30: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69   changes */..  i
7f40: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7f60: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7f70: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7f80: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7f90: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
7fa0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7fb0: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7fc0: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7fd0: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7fe0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7ff0: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
8000: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
8010: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
8020: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
8030: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
8040: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
80a0: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
80b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
80c0: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
80d0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
80e0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
80f0: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
8100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8110: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
8120: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
8130: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
8140: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
8150: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
8160: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
8170: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
8180: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
81a0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
81b0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
81c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
81d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
81e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
81f0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
8200: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
8230: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
8240: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
8250: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
8260: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
8270: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
8280: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
8290: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
82a0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
82b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
82c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
82d0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
82e0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
82f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8310: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8320: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8330: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
8340: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
8350: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
8360: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
8370: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
8380: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
8390: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
83a0: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
83b0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
83c0: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
83d0: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
83e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
83f0: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8420: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8430: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
8440: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
8450: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
8460: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
8470: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
8480: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
8490: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
84a0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
84b0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
84c0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
84d0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
84e0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
84f0: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8500: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8510: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8520: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8530: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
8540: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
8550: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
8560: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
8570: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
8580: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8590: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
85a0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
85b0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
85c0: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
85d0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
85e0: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
85f0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8600: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8610: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8620: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8630: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
8640: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
8650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8660: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
8670: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
8680: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
8690: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
86a0: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
86b0: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
86c0: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
86d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
86e0: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
86f0: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8710: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8720: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8730: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
8740: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
8750: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
8760: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
8770: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
8780: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
8790: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
87a0: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
87b0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
87c0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
87d0: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
87e0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87f0: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8800: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8810: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8820: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8830: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
8840: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
8850: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
8860: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
8870: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
8880: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
8890: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
88a0: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
88b0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
88c0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
88d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
88e0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
88f0: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8900: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8910: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8920: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
8940: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
8950: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
8960: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
8970: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
8980: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
8990: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
89a0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
89b0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
89c0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
89d0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
89e0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
89f0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8a00: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8a10: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8a20: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8a30: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
8a40: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
8a50: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
8a60: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
8a70: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
8a80: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
8a90: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8aa0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8ab0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8ac0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8ad0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8ae0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8af0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8b00: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8b10: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8b20: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8b30: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
8b40: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
8b50: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
8b60: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
8b70: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
8b80: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
8b90: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8ba0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8bb0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8bc0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8bd0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8be0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8bf0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8c00: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8c10: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8c20: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8c30: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
8c40: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
8c50: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
8c60: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
8c70: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8c80: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
8c90: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8ca0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8cb0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8cc0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8cd0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8ce0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8cf0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8d00: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8d10: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8d20: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8d30: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8d40: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8d50: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8d60: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8d70: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8d80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8d90: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8da0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8db0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8dc0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8dd0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8de0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8df0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8e00: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8e10: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8e20: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8e30: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8e40: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8e50: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8e60: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8e70: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8e80: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8e90: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8ea0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8eb0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8ec0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8ed0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8ee0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8ef0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8f00: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8f10: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8f20: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8f30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8f40: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8f50: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8f60: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8f70: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8f80: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8f90: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8fa0: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8fb0: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8fc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8fd0: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8fe0: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8ff0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
9000: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
9010: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9020: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
9030: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9040: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
9050: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
9060: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
9070: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
9080: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
9090: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
90a0: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
90b0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
90c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
90d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
90e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
90f0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
9100: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
9110: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
9120: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
9130: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
9140: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
9150: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
9160: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
9170: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
9180: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
9190: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
91a0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
91b0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
91c0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
91d0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
91e0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
91f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
9200: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
9210: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
9220: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
9230: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
9240: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
9250: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
9260: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
9270: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
9280: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
9290: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
92a0: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
92b0: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
92c0: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
92d0: 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  O..*/.#if SQLITE
92e0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
92f0: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9300: 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65  CH(x) ((x)->bUse
9310: 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64  Fetch).#else.# d
9320: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
9330: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
9340: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
9350: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
9360: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
9370: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
9380: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
9390: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
93a0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
93b0: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
93c0: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
93d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
93e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
93f0: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9400: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9410: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9430: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
9440: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
9450: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
9460: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
9470: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
9480: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
9490: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
94a0: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
94b0: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
94c0: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
94d0: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21  (pFd)->pMethods!
94e0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  =0)../*.** Retur
94f0: 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70  n true if this p
9500: 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74  ager uses a writ
9510: 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74  e-ahead log inst
9520: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
9530: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
9540: 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20  rnal. Otherwise 
9550: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  false..*/.#ifnde
9560: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
9570: 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  L.static int pag
9580: 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a  erUseWal(Pager *
9590: 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
95a0: 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21  n (pPager->pWal!
95b0: 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  =0);.}.#else.# d
95c0: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
95d0: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
95e0: 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
95f0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9600: 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c  agerWalFrames(v,
9610: 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e  w,x,y) 0.# defin
9620: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
9630: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
9640: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
9650: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
9660: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
9670: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E_OK.#endif..#if
9680: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
9690: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
96a0: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
96b0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
96c0: 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ger) );.**.** Th
96d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73  is function runs
96e0: 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f   many asserts to
96f0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63   try to find inc
9700: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a  onsistencies in.
9710: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
9720: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
9730: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  er object..*/.st
9740: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
9750: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
9760: 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a  r *p){.  Pager *
9770: 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f  pPager = p;..  /
9780: 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20  * State must be 
9790: 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65  valid. */.  asse
97a0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50  rt( p->eState==P
97b0: 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20  AGER_OPEN.      
97c0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
97d0: 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20  AGER_READER.    
97e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
97f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
9800: 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
9810: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9820: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
9830: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9840: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9850: 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
9860: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9870: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
9880: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9890: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
98a0: 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52  ROR.  );..  /* R
98b0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
98c0: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20   current state, 
98d0: 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e  a temp-file conn
98e0: 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65  ection always be
98f0: 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66  haves.  ** as if
9900: 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75   it has an exclu
9910: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
9920: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
9930: 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73  It never updates
9940: 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65  .  ** the change
9950: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20  -counter field, 
9960: 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  so the changeCou
9970: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
9980: 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  lways set..  */.
9990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
99a0: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65  pFile==0 || p->e
99b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
99c0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
99d0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
99e0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
99f0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
9a00: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a    /* If the useJ
9a10: 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63  ournal flag is c
9a20: 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61  lear, the journa
9a30: 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22  l-mode must be "
9a40: 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20  OFF". .  ** And 
9a50: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  if the journal-m
9a60: 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68  ode is "OFF", th
9a70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9a80: 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e  ust not be open.
9a90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9aa0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9ab0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9ac0: 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a  E_OFF || p->useJ
9ad0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
9ae0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9af0: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
9b00: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73  LMODE_OFF || !is
9b10: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a  Open(p->jfd) );.
9b20: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
9b30: 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e   MEMDB implies n
9b40: 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e  oSync. And an in
9b50: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
9b60: 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69   Since .  ** thi
9b70: 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65  s means an in-me
9b80: 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f  mory pager perfo
9b90: 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c  rms no IO at all
9ba0: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f  , it cannot enco
9bb0: 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68  unter .  ** eith
9bc0: 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
9bd0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  or SQLITE_FULL d
9be0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f  uring rollback o
9bf0: 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69  r while finalizi
9c00: 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  ng .  ** a journ
9c10: 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75  al file. (althou
9c20: 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  gh the in-memory
9c30: 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65   journal impleme
9c40: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a  ntation may .  *
9c50: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
9c60: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c  IOERR_NOMEM whil
9c70: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
9c80: 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  le is being writ
9c90: 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69  ten). It .  ** i
9ca0: 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20  s therefore not 
9cb0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20  possible for an 
9cc0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9cd0: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
9ce0: 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a  OR .  ** state..
9cf0: 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
9d00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9d10: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
9d20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9d30: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9d40: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9d50: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9d60: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9d70: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9d80: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9d90: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9da0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9db0: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9dc0: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9dd0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
9de0: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
9df0: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
9e00: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
9e10: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
9e20: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
9e30: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
9e40: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
9e50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9e60: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
9e70: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
9e80: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9e90: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9ea0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
9eb0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
9ec0: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
9ed0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
9ee0: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
9ef0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
9f00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f10: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9f30: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9f40: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
9f50: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
9f60: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
9f70: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
9f80: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9f90: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
9fa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9fb0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9fc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9fd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fe0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9ff0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a000: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
a010: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
a020: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a030: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a040: 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61  _LOCKED:.      a
a050: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a060: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a070: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a080: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a090: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a0a0: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
a0b0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
a0c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a0d0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a0e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a0f0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a100: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a110: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a120: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a130: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a140: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a150: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a160: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a170: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a180: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a190: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a1a0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
a1b0: 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  aster==0 );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a1e0: 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20  CACHEMOD:.      
a1f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a200: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a220: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a240: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a250: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a260: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73          /* It is
a270: 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69   possible that i
a280: 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  f journal_mode=w
a290: 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69  al here that nei
a2a0: 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20  ther the.       
a2b0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
a2c0: 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c   nor the WAL fil
a2d0: 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73  e are open. This
a2e0: 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a   happens during.
a2f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c          ** a rol
a300: 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f  lback transactio
a310: 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20  n that switches 
a320: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
a330: 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a  e=off.        **
a340: 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   to journal_mode
a350: 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  =wal..        */
a360: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a370: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a380: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a390: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a3a0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a3b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a3d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a3e0: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  F .             
a3f0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a400: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a410: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a420: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
a430: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a440: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a450: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a460: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a470: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a480: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a490: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a4a0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a4b0: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a4c0: 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  _DBMOD:.      as
a4d0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  sert( p->eLock==
a4e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a4f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a500: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a520: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
a530: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a540: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a550: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c  ( p->eLock>=EXCL
a560: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a570: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a580: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a590: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a5a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a5b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a5d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a5e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a5f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c  ger->dbOrigSize<
a620: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
a630: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
a640: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a650: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a660: 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  HED:.      asser
a670: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a680: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a6a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a6b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a6c0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a6d0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a6e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a6f0: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
a700: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a710: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a720: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a730: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
a740: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a750: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a760: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
a770: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a780: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
a790: 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54  RROR:.      /* T
a7a0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
a7b0: 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
a7c0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
a7d0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a  to the pager if.
a7e0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f        ** in ERRO
a7f0: 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
a800: 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f  se the pager sho
a810: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
a820: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a   dropped.      *
a830: 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  * back to OPEN s
a840: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
a850: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a860: 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
a870: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a880: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a890: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a8a0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
a8b0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a8c0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
a8d0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  1;.}.#endif /* i
a8e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a  fndef NDEBUG */.
a8f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a900: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  EBUG ./*.** Retu
a910: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
a920: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
a930: 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61   string in a sta
a940: 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  tic buffer.** co
a950: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61  ntaining the sta
a960: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
a970: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a980: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68   an argument. Th
a990: 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  is.** is intende
a9a0: 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  d to be used wit
a9b0: 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46  hin debuggers. F
a9c0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61  or example, as a
a9d0: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  n alternative.**
a9e0: 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67   to "print *pPag
a9f0: 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a  er" in gdb:.**.*
aa00: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
aa10: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
aa20: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
aa30: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  /.static char *p
aa40: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
aa50: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74  (Pager *p){.  st
aa60: 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31  atic char zRet[1
aa70: 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  024];..  sqlite3
aa80: 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20  _snprintf(1024, 
aa90: 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c  zRet,.      "Fil
aaa0: 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e  ename:      %s\n
aab0: 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20  ".      "State: 
aac0: 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f          %s errCo
aad0: 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22  de=%d\n".      "
aae0: 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25  Lock:          %
aaf0: 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  s\n".      "Lock
ab00: 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69  ing mode:  locki
ab10: 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20  ng_mode=%s\n".  
ab20: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64      "Journal mod
ab30: 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  e:  journal_mode
ab40: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61  =%s\n".      "Ba
ab50: 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d  cking store: tem
ab60: 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25  pFile=%d memDb=%
ab70: 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c  d useJournal=%d\
ab80: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
ab90: 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  l:       journal
aba0: 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c  Off=%lld journal
abb0: 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20  Hdr=%lld\n".    
abc0: 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20    "Size:        
abd0: 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72    dbsize=%d dbOr
abe0: 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65  igSize=%d dbFile
abf0: 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Size=%d\n".     
ac00: 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a   , p->zFilename.
ac10: 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74        , p->eStat
ac20: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  e==PAGER_OPEN   
ac30: 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e           ? "OPEN
ac40: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac50: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
ac60: 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22  DER          ? "
ac70: 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20  READER" :.      
ac80: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ac90: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
aca0: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43     ? "WRITER_LOC
acb0: 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  KED" :.        p
acc0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
acd0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
ace0: 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ? "WRITER_CACHEM
acf0: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
ad00: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ad10: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f  RITER_DBMOD    ?
ad20: 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20   "WRITER_DBMOD" 
ad30: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ad40: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ad50: 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52  R_FINISHED ? "WR
ad60: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a  ITER_FINISHED" :
ad70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad80: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
ad90: 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52            ? "ERR
ada0: 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  OR" : "?error?".
adb0: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
adc0: 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20  errCode.      , 
add0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  p->eLock==NO_LOC
ade0: 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f  K         ? "NO_
adf0: 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20  LOCK" :.        
ae00: 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  p->eLock==RESERV
ae10: 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53  ED_LOCK   ? "RES
ae20: 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20  ERVED" :.       
ae30: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
ae40: 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58  SIVE_LOCK  ? "EX
ae50: 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20  CLUSIVE" :.     
ae60: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41     p->eLock==SHA
ae70: 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22  RED_LOCK     ? "
ae80: 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20  SHARED" :.      
ae90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e    p->eLock==UNKN
aea0: 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55  OWN_LOCK    ? "U
aeb0: 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f  NKNOWN" : "?erro
aec0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  r?".      , p->e
aed0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22  xclusiveMode ? "
aee0: 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f  exclusive" : "no
aef0: 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d  rmal".      , p-
af00: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
af10: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
af20: 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f  MEMORY   ? "memo
af30: 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ry" :.        p-
af40: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
af50: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
af60: 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22  OFF      ? "off"
af70: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
af80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
afa0: 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22  ETE   ? "delete"
afb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
afc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
afe0: 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74  SIST  ? "persist
aff0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b000: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b010: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
b020: 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61  UNCATE ? "trunca
b030: 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  te" :.        p-
b040: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b050: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b060: 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22  WAL      ? "wal"
b070: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
b080: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d     , (int)p->tem
b090: 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d  pFile, (int)p->m
b0a0: 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73  emDb, (int)p->us
b0b0: 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c  eJournal.      ,
b0c0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20   p->journalOff, 
b0d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  p->journalHdr.  
b0e0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62      , (int)p->db
b0f0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
b100: 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70  OrigSize, (int)p
b110: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29  ->dbFileSize.  )
b120: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74  ;..  return zRet
b130: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b140: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
b150: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
b160: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
b170: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
b180: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
b190: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
b1a0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
b1b0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
b1c0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
b1d0: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
b1e0: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
b1f0: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
b200: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
b210: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
b220: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
b230: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
b240: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
b250: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
b260: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
b270: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
b280: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
b290: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
b2a0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
b2b0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
b2c0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
b2d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
b2e0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
b2f0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
b300: 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t *p;.  Pgno pgn
b310: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
b320: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
b330: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
b340: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
b350: 20 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e     p = &pPager->
b360: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
b370: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
b380: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
b390: 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74  te3BitvecTestNot
b3a0: 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70  Null(p->pInSavep
b3b0: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
b3c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b3d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b3e0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
b3f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
b400: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
b410: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
b420: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
b430: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
b440: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
b450: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
b460: 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
b470: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
b480: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
b490: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
b4a0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23   pPg->pgno);.}.#
b4b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
b4c0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
b4d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b4e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b4f0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b500: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b510: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b520: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b530: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b540: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b550: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b560: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b570: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b580: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b590: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b5a0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b5b0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b5c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b5d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b5e0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b5f0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b600: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b610: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b620: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b630: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b640: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b650: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b660: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b690: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b6a0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b6b0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b6c0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b6d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b6e0: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b6f0: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b700: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b710: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b720: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b730: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b740: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b750: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b760: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b770: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b780: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b790: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b7a0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b7b0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b7c0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b7d0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b7e0: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b7f0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b800: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b810: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b820: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b830: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b840: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b850: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b860: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b870: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b880: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b890: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b8a0: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b8b0: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b8c0: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b8d0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b8e0: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b8f0: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b900: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b910: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b920: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b930: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b940: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b950: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b960: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b970: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b980: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b990: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b9a0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b9b0: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b9c0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b9d0: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b9e0: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b9f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ba00: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
ba10: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
ba20: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
ba30: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
ba40: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
ba50: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
ba60: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
ba70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
ba80: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
ba90: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
baa0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
bab0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
bac0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
bad0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
bae0: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
baf0: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
bb00: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
bb10: 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   : sqlite3OsUnlo
bb20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
bb30: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Lock);.    if( p
bb40: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
bb50: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
bb60: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bb70: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bb80: 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
bb90: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c  (("UNLOCK %p %d\
bba0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bbb0: 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k)).  }.  return
bbc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
bbd0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
bbe0: 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c  file to level eL
bbf0: 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20  ock, which must 
bc00: 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44  be either SHARED
bc10: 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56  _LOCK,.** RESERV
bc20: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
bc30: 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68  SIVE_LOCK. If th
bc40: 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63  e caller is succ
bc50: 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a  essful, set the.
bc60: 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  ** Pager.eLock v
bc70: 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e  ariable to the n
bc80: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
bc90: 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  . .**.** Except,
bca0: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
bcb0: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
bcc0: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73  N_LOCK when this
bcd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a   function is .**
bce0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
bcf0: 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73  modify it unless
bd00: 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67   the new locking
bd10: 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53   state is EXCLUS
bd20: 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65  IVE_LOCK. .** Se
bd30: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
bd40: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
bd50: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
bd60: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
bd70: 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a  on .** of this..
bd80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
bd90: 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20  gerLockDb(Pager 
bda0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f  *pPager, int eLo
bdb0: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
bdc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
bdd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41  sert( eLock==SHA
bde0: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  RED_LOCK || eLoc
bdf0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
be00: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   || eLock==EXCLU
be10: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  SIVE_LOCK );.  i
be20: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
be30: 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72  <eLock || pPager
be40: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
be50: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
be60: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
be70: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
be80: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
be90: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
bea0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
beb0: 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65  ITE_OK && (pPage
bec0: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
bed0: 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45  N_LOCK||eLock==E
bee0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29  XCLUSIVE_LOCK) )
bef0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bf00: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bf10: 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
bf20: 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
bf30: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
bf40: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
bf50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bf60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bf70: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
bf80: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
bf90: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
bfa0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
bfb0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
bfc0: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
bfd0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
bfe0: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
bff0: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
c000: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
c010: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
c020: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
c030: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
c040: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
c050: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
c060: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
c070: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
c080: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
c090: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
c0a0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
c0b0: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
c0c0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
c0d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
c0e0: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
c0f0: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
c100: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
c110: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
c120: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
c130: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
c140: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
c150: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
c160: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
c170: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c180: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
c190: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
c1a0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
c1b0: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
c1c0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
c1d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c1e0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
c1f0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
c200: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c210: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c220: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c230: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c240: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
c250: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
c260: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c270: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
c280: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
c290: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
c2a0: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
c2d0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
c2e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
c2f0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
c310: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
c320: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
c350: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
c360: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c370: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
c380: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c390: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c3a0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
c3b0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
c3c0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
c3d0: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
c3e0: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
c3f0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c400: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
c410: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
c420: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
c430: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
c440: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
c450: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
c460: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
c470: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
c480: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
c490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c4a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
c4b0: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
c4c0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
c4d0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c4e0: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
c4f0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c500: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c510: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c520: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c530: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c540: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c550: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c560: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c570: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c580: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c5a0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c5b0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c5c0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c5d0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c5f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c600: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c610: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c620: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c630: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c640: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c650: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c660: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c670: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c680: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c690: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c6a0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c6b0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c6c0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c6d0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c6e0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c6f0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c700: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c710: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c720: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c730: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c740: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c750: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c770: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c780: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c790: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c7a0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c7b0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c7c0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c7d0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c7e0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c7f0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c800: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c810: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c820: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c830: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c840: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c850: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c860: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c870: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c880: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c890: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c8a0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c8b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8c0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c8d0: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c8e0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c8f0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c900: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c910: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c920: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c930: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c940: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c950: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c960: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c970: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c980: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c990: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c9a0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c9b0: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c9c0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
c9d0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
c9e0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
c9f0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
ca00: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
ca10: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
ca20: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
ca30: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ca40: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
ca50: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
ca60: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
ca70: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
ca80: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
ca90: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
caa0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cab0: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
cac0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cad0: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cae0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
caf0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb00: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cb10: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cb20: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cb30: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cb40: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cb50: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cb60: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cb70: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cb80: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cb90: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cba0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cbb0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cbc0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
cbd0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
cbe0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cbf0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cc00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
cc10: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cc20: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cc30: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cc40: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cc50: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cc60: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cc70: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
cc80: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
cc90: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
cca0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
ccb0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
ccc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ccd0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cce0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
ccf0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cd00: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cd10: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cd20: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cd30: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cd40: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cd50: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cd60: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cd70: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cd80: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cd90: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cda0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cdb0: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cdc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cdd0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
cde0: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
cdf0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
ce00: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
ce10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ce20: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ce30: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
ce40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
ce50: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ce60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
ce70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ce80: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
ce90: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
cea0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
ceb0: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cec0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cef0: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cf20: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cf30: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cf40: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf60: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cf70: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cf80: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cf90: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
cfb0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
cfc0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
cfd0: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d000: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d020: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d030: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d040: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d050: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d060: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d070: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d080: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d090: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d0a0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d0b0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d0c0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d0d0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d0e0: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d0f0: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d100: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d110: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d120: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d130: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d140: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d150: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d160: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d170: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d180: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d190: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d1a0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d1b0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d1c0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d1d0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d1e0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d1f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d210: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d220: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d230: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d240: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d250: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d260: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d270: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d280: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d290: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d2a0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d2b0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d2c0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d2d0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d2e0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d2f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d300: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d310: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d320: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d330: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d350: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d360: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d370: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d380: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d390: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d3a0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d3b0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d3c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d3d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d3e0: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d3f0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d400: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d420: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d430: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d440: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d450: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d460: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d470: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d480: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d490: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d4a0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d4b0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d4c0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d560: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d570: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d580: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d590: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d5a0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d5b0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d5c0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d5d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d5e0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d5f0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d600: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d610: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d620: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d630: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d640: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d650: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d660: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d670: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d680: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d690: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d6a0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d6b0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d6d0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d6e0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d6f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d700: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d710: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d720: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d730: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d740: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d750: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d760: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d770: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d780: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d790: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d7a0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d7b0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d7c0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d7d0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d7e0: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d7f0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d800: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d810: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d820: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d830: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d840: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d850: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d860: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d870: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d880: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d890: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d8a0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d8b0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d8c0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d8d0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d8e0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d8f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d900: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d910: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d920: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d930: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d940: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d950: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d960: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d970: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d980: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d990: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d9a0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d9b0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d9c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d9d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d9e0: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d9f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
da00: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
da10: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
da20: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
da30: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
da40: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
da50: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
da60: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
da70: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
da80: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
da90: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
daa0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
dab0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
dac0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
dad0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
dae0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
daf0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
db20: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
db30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
db40: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
db50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
db60: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
db70: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
db80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
db90: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
dba0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
dbb0: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
dbc0: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
dbd0: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
dbe0: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
dbf0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
dc00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dc10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
dc20: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
dc30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
dc40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
dc50: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc70: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
dc80: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
dc90: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
dca0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
dcb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
dcc0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
dcd0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
dce0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
dcf0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
dd00: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
dd10: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
dd20: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
dd30: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
dd40: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
dd50: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
dd60: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
dd70: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
dd80: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
dd90: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
dda0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
ddb0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
ddc0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
ddd0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
dde0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ddf0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
de00: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
de10: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
de20: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
de30: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
de40: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
de50: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
de60: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
de70: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
de80: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
de90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dea0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
deb0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
dec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ded0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
dee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
def0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
df00: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
df10: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
df20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
df30: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
df40: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
df50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
df60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
df70: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
df80: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
df90: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
dfa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
dfb0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
dfc0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
dfd0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
dfe0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
dff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
e000: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
e010: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
e020: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
e030: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e040: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
e050: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
e060: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
e070: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
e080: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
e090: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
e0a0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
e0b0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
e0c0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
e0d0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
e0e0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
e0f0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
e100: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
e110: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
e120: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
e130: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
e140: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
e150: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
e160: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
e170: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
e180: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
e190: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
e1a0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
e1b0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
e1c0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
e1d0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
e1e0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
e1f0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
e200: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e220: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e230: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
e240: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
e250: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
e260: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
e270: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
e280: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
e290: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
e2a0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
e2b0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
e2c0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
e2d0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e300: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
e310: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
e320: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e350: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
e360: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e370: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
e380: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
e390: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
e3a0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
e3b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e3c0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
e3d0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
e3e0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
e3f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e400: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
e410: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
e420: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
e430: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
e440: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
e450: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
e460: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
e470: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
e480: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
e490: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
e4a0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
e4b0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
e4c0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
e4d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e4e0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4f0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
e500: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
e510: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
e520: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
e530: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e540: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
e550: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
e560: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e570: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
e580: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
e590: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
e5a0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
e5b0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
e5c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
e5d0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e5e0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e5f0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e600: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e610: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e620: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e630: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e640: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e650: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e660: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e670: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e680: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e690: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e6a0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e6b0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e6c0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e6d0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e6e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e6f0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e700: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e710: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e720: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e730: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e740: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e750: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e760: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e770: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e780: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e790: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e7a0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e7b0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e7c0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e7d0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e7e0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e7f0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e800: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e810: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e820: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e830: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e840: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e850: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e860: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e870: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e880: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e890: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e8a0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e8b0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e8c0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e8d0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e8e0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e8f0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e900: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e910: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e920: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e930: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e940: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e950: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e960: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e970: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e980: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e990: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e9a0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e9b0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e9c0: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e9d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e9e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e9f0: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
ea00: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
ea10: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
ea20: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
ea30: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
ea40: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
ea50: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
ea60: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
ea70: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
ea80: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
ea90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eaa0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
eab0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
eac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
ead0: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
eae0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eaf0: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
eb00: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
eb10: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
eb20: 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  zer */ .  sqlite
eb30: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
eb40: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
eb50: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
eb60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
eb70: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
eb80: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
eb90: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
eba0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
ebb0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
ebc0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
ebd0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
ebe0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ebf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
ec00: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
ec10: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
ec20: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
ec30: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
ec40: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
ec50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ec60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ec70: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
ec80: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
ec90: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
eca0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
ecb0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ecc0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
ecd0: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
ece0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
ecf0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
ed00: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
ed10: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
ed20: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
ed30: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
ed40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
ed50: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
ed60: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
ed70: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
ed80: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
ed90: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
eda0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
edb0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
edc0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
edd0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
ede0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
edf0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ee00: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
ee10: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
ee20: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
ee30: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
ee40: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
ee50: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
ee60: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
ee70: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
ee80: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
ee90: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
eea0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
eeb0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
eec0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
eed0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
eee0: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
eef0: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
ef00: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
ef10: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
ef20: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
ef30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
ef40: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
ef50: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
ef60: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
ef70: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
ef80: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
ef90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
efa0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
efb0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
efc0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
efd0: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
efe0: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
eff0: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
f000: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
f010: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
f020: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
f030: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
f040: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
f050: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
f060: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
f070: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
f080: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
f090: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
f0a0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
f0b0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
f0c0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
f0d0: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
f0e0: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
f0f0: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
f100: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
f110: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
f120: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
f130: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
f140: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
f150: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
f160: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
f170: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
f180: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
f190: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
f1a0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
f1b0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
f1c0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
f1d0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
f1e0: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
f1f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
f200: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
f210: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
f220: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
f230: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
f240: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
f250: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
f260: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
f270: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
f280: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f290: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
f2a0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
f2b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f2c0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
f2d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f2e0: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
f2f0: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
f300: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f310: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
f320: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
f330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
f340: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f350: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
f360: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
f370: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f380: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
f390: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
f3a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
f3b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
f3c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
f3d0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
f3e0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
f3f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f400: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
f410: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f420: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
f430: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
f440: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
f450: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
f460: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
f470: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
f480: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
f490: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
f4a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
f4b0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
f4c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
f4d0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
f4e0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
f4f0: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
f500: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
f510: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
f520: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
f530: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
f540: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
f550: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
f560: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
f570: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
f580: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
f590: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
f5a0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
f5b0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
f5c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
f5d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f5e0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f5f0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f600: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f610: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f620: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f630: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f640: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f650: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f660: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f670: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f680: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f690: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f6a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f6b0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f6c0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f6d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f6e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f6f0: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f700: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f710: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f720: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f730: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f740: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f770: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f780: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f790: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f7b0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f7c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f7d0: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f7e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f800: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f810: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f820: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f830: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f840: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f850: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f860: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f870: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f880: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f890: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f8a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f8b0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f8c0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f8d0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f8e0: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f8f0: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f900: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f910: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f920: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f930: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f940: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f950: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f960: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f970: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f980: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f990: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f9a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f9b0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f9c0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f9d0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f9e0: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f9f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
fa00: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
fa10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fa20: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
fa30: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
fa40: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
fa50: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
fa60: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
fa70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
fa80: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
fa90: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
faa0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
fab0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
fac0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
fad0: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
fae0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
faf0: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
fb00: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
fb10: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
fb20: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
fb30: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
fb40: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
fb50: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
fb60: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
fb70: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
fb80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
fb90: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
fba0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
fbb0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
fbc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fbd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
fbe0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
fbf0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
fc00: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
fc10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fc20: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fc30: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
fc40: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
fc50: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
fc60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fc70: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
fc80: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
fc90: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
fca0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
fcb0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
fcc0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
fcd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
fce0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fcf0: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
fd00: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
fd10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
fd20: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fd30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fd40: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
fd50: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
fd60: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fd70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fd80: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
fd90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
fda0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
fdb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fdc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fdd0: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
fde0: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
fdf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
fe00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fe10: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
fe20: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
fe30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe40: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
fe50: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
fe60: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
fe70: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
fe80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
fe90: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
fea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
feb0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
fec0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
fed0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
fef0: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
ff00: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ff10: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ff20: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ff30: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
ff40: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
ff50: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ff60: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ff70: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
ff80: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
ff90: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
ffa0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
ffb0: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
ffc0: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
ffd0: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
ffe0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fff0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
10000 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
10010 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
10020 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
10030 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
10040 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
10050 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
10060 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
10070 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
10080 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
10090 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
100a0 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
100b0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
100c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
100d0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
100e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
100f0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
10100 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
10110 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
10120 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
10130 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
10140 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
10150 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
10160 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
10170 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
10180 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
10190 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
101a0 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
101b0 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
101c0 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
101d0 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
101e0 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
101f0 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
10200 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
10210 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
10220 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
10230 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
10240 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
10250 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
10260 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
10270 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
10280 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
10290 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
102a0 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
102b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
102c0 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
102d0 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
102e0 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
102f0 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
10300 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
10310 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
10320 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
10330 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
10340 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
10350 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
10360 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
10370 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
10380 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
10390 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
103a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
103b0 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
103c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
103d0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
103e0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
103f0 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
10400 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
10410 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
10420 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
10430 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
10440 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
10450 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
10460 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
10470 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
10480 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
10490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
104a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
104b0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
104c0 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
104d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
104e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
104f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10500 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
10510 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
10520 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
10530 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
10540 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
10550 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
10560 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
10570 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
10580 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
10590 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
105a0 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
105b0 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
105c0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
105d0 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
105e0 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
105f0 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10600 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10610 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10620 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10630 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
10650 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
10660 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
10670 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
10680 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
10690 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
106a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
106b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
106c0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
106d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
106e0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
106f0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10700 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10710 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10720 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10730 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10740 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
10750 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
10760 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
10770 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
10780 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10790 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
107a0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
107b0 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
107c0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
107d0 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
107e0 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
107f0 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10800 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10810 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10820 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10830 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10840 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10850 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10860 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10870 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
10880 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10890 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
108a0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
108b0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
108c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
108d0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
108e0 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
108f0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10900 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10910 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10920 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10930 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10940 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10950 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10960 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10970 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
10980 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
10990 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
109a0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
109b0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
109c0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
109d0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
109e0 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
109f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10a00 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10a10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10a20 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10a30 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10a40 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10a70 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
10a80 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
10a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
10aa0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
10ab0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
10ac0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10ae0 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10af0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10b00 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10b10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10b20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10b30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10b40 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10b50 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10b70 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
10b80 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
10b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10ba0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
10bb0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
10bc0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
10bd0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10be0 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10bf0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10c00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10c10 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69  MEMORY .   || !i
10c20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
10c30 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  d).  ){.    retu
10c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10c50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  }.  pPager->setM
10c60 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73  aster = 1;.  ass
10c70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10c80 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
10c90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
10ca0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
10cb0 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
10cc0 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
10cd0 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
10ce0 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10cf0 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10d00 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10d10 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10d20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10d30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10d40 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10d50 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
10d60 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
10d70 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10d80 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
10d90 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
10da0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
10db0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
10dc0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
10dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
10de0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10df0 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10e00 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10e10 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10e20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10e30 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10e40 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10e50 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10e60 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10e70 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10e80 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
10e90 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
10ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10eb0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
10ec0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10ed0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
10ee0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10ef0 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10f00 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10f10 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10f20 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10f30 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10f40 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10f50 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10f60 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10f70 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10f80 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10f90 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10fa0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10fb0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10fc0 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10fd0 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10fe0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10ff0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
11000 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
11010 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
11020 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11030 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11040 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
11050 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20  urnalMagic, 8,. 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11090 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
110a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
110b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
110c0 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
110d0 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  20);..  /* If th
110e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
110f0 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
11100 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
11110 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
11120 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
11130 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
11140 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
11150 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
11160 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
11170 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
11180 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
11190 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
111a0 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
111b0 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
111c0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
111d0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
111e0 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
111f0 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
11200 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11210 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
11220 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
11230 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
11240 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
11250 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
11260 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
11270 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
11280 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
11290 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
112a0 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
112b0 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
112c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
112d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
112e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
112f0 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20  d, &jrnlSize)). 
11300 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50    && jrnlSize>pP
11310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11320 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
11330 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
11340 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
11350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11360 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11370 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  rc;.}../*.** Dis
11380 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11390 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
113a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
113b0 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
113c0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
113d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
113e0 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  .  pPager->iData
113f0 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c  Version++;.  sql
11400 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
11410 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
11420 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
11430 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
11440 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
11450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
11460 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11470 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32  ion value.*/.u32
11480 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74   sqlite3PagerDat
11490 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a  aVersion(Pager *
114a0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
114b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
114c0 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  e>PAGER_OPEN );.
114d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
114e0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d  >iDataVersion;.}
114f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
11500 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
11510 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
11520 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
11530 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
11540 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
11550 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
11560 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
11570 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
11580 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
11590 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
115a0 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
115b0 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
115c0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
115d0 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
115e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
115f0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
11600 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
11610 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
11620 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
11630 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
11640 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11650 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11660 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
11670 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11680 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11690 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
116a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
116b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
116c0 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
116d0 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
116e0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
116f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11700 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
11710 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
11720 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11730 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
11740 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
11750 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
11760 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11770 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
11780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11790 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
117a0 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
117b0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
117c0 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
117d0 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
117e0 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
117f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
11800 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
11810 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
11820 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
11830 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
11840 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
11850 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
11860 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
11870 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
118a0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
118b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
118c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
118d0 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
118e0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
118f0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
11900 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
11910 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
11920 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
11930 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
11940 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
11950 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
11960 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
11970 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
11980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
11990 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
119a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
119b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
119c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
119d0 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
119e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
119f0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61  *.** Free the Pa
11a00 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 61  ger.pInJournal a
11a10 6e 64 20 50 61 67 65 72 2e 70 41 6c 6c 52 65 61  nd Pager.pAllRea
11a20 64 20 62 69 74 76 65 63 20 6f 62 6a 65 63 74 73  d bitvec objects
11a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11a40 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63   pagerFreeBitvec
11a50 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11a60 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
11a70 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11a80 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
11a90 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11aa0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c  troy(pPager->pAl
11ab0 6c 52 65 61 64 29 3b 0a 20 20 70 50 61 67 65 72  lRead);.  pPager
11ac0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
11ad0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
11ae0 52 65 61 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Read = 0;.}../*.
11af0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11b00 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11b10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11b20 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11b30 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
11b40 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
11b50 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
11b60 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
11b70 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
11b80 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
11b90 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11ba0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11bb0 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11bc0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11bd0 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11be0 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11bf0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11c00 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11c10 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11c20 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11c30 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11c40 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
11c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
11c60 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
11c70 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
11c80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11c90 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11ca0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11cb0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11cc0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11cd0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11ce0 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11cf0 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11d00 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11d10 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11d20 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11d30 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
11d40 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
11d50 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
11d60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
11d70 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
11d80 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
11d90 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11da0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11db0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11dc0 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11dd0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11de0 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11df0 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11e00 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11e10 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11e20 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11e30 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
11e40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
11e50 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
11e60 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
11e70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11e80 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
11e90 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11ea0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11eb0 20 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65 65   );..  pagerFree
11ec0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b  Bitvecs(pPager);
11ed0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11ee0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11ef0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11f00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11f10 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11f20 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11f40 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11f50 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
11f60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
11f70 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11f80 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
11f90 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
11fa0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
11fb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11fd0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11fe0 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11ff0 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
12000 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
12010 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
12020 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
12030 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
12040 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
12050 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
12060 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12070 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12080 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12090 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
120a0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
120b0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
120c0 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
120d0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
120e0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
120f0 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12100 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
12110 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12120 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12130 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12140 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12150 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12160 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12170 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12180 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12190 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
121a0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
121b0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
121c0 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
121d0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
121e0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
121f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12200 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12210 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12220 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12230 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12240 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12250 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12260 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12270 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12280 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12290 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
122a0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
122b0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
122c0 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
122d0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
122e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
122f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12300 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12310 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12320 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12330 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12340 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12350 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12360 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12370 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12380 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12390 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
123a0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
123b0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
123c0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
123d0 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
123e0 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
123f0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12400 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
12410 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12420 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12430 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12440 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12450 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12460 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12470 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12480 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12490 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
124a0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
124b0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
124c0 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
124d0 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
124e0 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
124f0 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12500 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
12510 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12520 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12530 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12540 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12550 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
12560 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12570 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12580 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12590 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
125a0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
125b0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
125c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
125d0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
125e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
125f0 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12600 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12610 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12620 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12630 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12640 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12650 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
12660 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12670 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12680 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12690 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
126a0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
126b0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
126c0 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
126d0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
126e0 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
126f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12700 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12710 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12720 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12740 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12750 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12760 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12770 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12780 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
12790 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
127a0 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  K;.    if( USEFE
127b0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
127c0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
127d0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
127e0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
127f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12800 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12810 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12820 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12830 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12840 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12850 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
12860 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
12870 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
12880 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
12890 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
128a0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
128b0 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
128c0 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
128d0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
128e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
128f0 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12900 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12910 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12920 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12930 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12940 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12950 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
12960 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
12970 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12980 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
12990 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
129a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
129b0 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
129c0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
129d0 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
129e0 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
129f0 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12a00 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12a10 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12a20 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12a30 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12a40 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12a50 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12a60 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12a70 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
12a80 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
12a90 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
12aa0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
12ab0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12ac0 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12ad0 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12ae0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12af0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b00 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12b10 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12b20 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12b30 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12b40 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12b50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12b60 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12b70 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12b80 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12b90 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12ba0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12bb0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12bc0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12bd0 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12be0 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12bf0 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12c00 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12c10 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12c20 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12c30 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12c40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12c50 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12c60 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12c70 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12c80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12c90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12ca0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12cb0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12cc0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12cd0 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12ce0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12cf0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12d00 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12d10 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12d20 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12d30 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12d40 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12d50 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12d60 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12d70 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12d80 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12d90 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12db0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12dc0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12dd0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12de0 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ge);../*.** This
12df0 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12e00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12e10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12e20 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12e30 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12e40 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12e50 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12e60 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12e70 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12e80 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12e90 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12ea0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12eb0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12ec0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
12ed0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
12ee0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
12ef0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
12f00 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
12f10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
12f20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12f30 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12f40 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12f50 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12f60 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12f70 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12f80 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12f90 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12fa0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12fb0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12fc0 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12fd0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12fe0 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12ff0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
13000 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
13010 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
13020 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
13030 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
13040 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
13050 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
13060 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
13070 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
13080 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
13090 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
130a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
130b0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
130c0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
130d0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
130e0 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
130f0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13100 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13110 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13120 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13130 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13140 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13150 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13160 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13170 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
13180 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
13190 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
131a0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
131b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
131c0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
131d0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
131e0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
131f0 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13200 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13210 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13220 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13230 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13240 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13250 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13260 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13270 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
13280 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
13290 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
132a0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
132b0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
132c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
132d0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
132e0 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
132f0 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13300 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13310 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13320 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13330 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13340 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13350 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13360 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13370 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
13380 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
13390 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
133b0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
133c0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
133d0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
133e0 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
133f0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13400 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13410 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13420 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13440 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13450 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13460 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13470 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
13480 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13490 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
134a0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
134b0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
134c0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
134d0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
134e0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
134f0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13500 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13510 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13520 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13530 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13540 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13550 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13560 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13570 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13580 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13590 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
135a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
135b0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
135c0 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
135d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
135e0 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
135f0 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
13600 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
13610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13620 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13630 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13640 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13650 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13660 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13670 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13680 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13690 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
136a0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
136b0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
136c0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
136d0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
136e0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
136f0 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
13700 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13710 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
13720 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13730 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13740 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13750 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13760 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13770 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13780 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
13790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
137a0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
137b0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
137c0 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
137d0 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
137e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
137f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
13800 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13810 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13820 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
13830 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
13840 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13850 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13860 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
13870 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
13880 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
13890 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
138a0 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
138b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
138c0 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
138d0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
138e0 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
138f0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
13900 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
13910 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
13920 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
13930 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
13940 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13950 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13960 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13970 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
13980 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
13990 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
139a0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
139b0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
139c0 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
139d0 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
139e0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
139f0 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
13a00 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
13a10 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
13a20 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
13a30 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
13a40 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13a50 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13a60 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13a70 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
13a80 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
13a90 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
13aa0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
13ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13ac0 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13ad0 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13ae0 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
13af0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13b00 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
13b10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
13b20 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
13b30 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
13b40 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13b60 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13b70 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13b80 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13b90 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13ba0 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13bb0 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13bc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13be0 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
13bf0 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
13c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
13c10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13c20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
13c30 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
13c40 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13c50 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13c60 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13c70 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13c80 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13c90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13ca0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13cb0 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13cc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13cf0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13d00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
13d10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13d20 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13d30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13d50 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13d60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13d70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13dd0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13de0 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13df0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13e00 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
13e10 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13e20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13e30 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
13e40 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
13e50 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
13e60 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
13e70 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
13e80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
13e90 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
13ea0 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
13eb0 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
13ec0 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
13ed0 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
13ee0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
13ef0 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
13f00 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
13f10 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
13f20 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
13f30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
13f40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
13f50 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
13f60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
13f70 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
13f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13f90 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
13fa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
13fb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13fc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13fd0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13fe0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
13ff0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
14000 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
14010 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14020 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
14030 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
14040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
14050 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
14060 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
14070 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14080 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
140a0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
140b0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
140c0 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
140d0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
140e0 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
140f0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
14100 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
14110 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
14120 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
14130 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
14140 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
14150 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
14160 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
14170 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
14180 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
14190 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
141a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
141b0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
141c0 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
141d0 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74  te = (!pPager->t
141e0 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74  empFile && sqlit
141f0 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28  e3JournalExists(
14200 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20  pPager->jfd));. 
14210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14230 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14240 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
14250 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14260 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14270 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14280 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
14290 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
142a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
142b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
142c0 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
142d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
142e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
142f0 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14310 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14320 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
14330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14340 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14350 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
14360 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14370 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
14380 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
14390 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
143a0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
143b0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
143c0 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
143d0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
143e0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
143f0 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14400 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
14410 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
14420 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
14430 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
14440 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
14450 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
14460 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
14470 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14480 0a 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74  ..  pagerFreeBit
14490 76 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20  vecs(pPager);.  
144a0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
144b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
144c0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
144d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
144e0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
144f0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
14500 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
14510 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
14520 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14530 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14540 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14550 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14560 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14570 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14580 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14590 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
145a0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
145b0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
145c0 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
145d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
145e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
145f0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
14600 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
14610 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
14620 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14630 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14640 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14650 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14660 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14670 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14680 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14690 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
146a0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
146b0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
146c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
146d0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
146e0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
146f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14700 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14710 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
14720 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14730 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14740 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14750 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14760 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14770 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14780 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14790 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
147a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
147b0 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
147c0 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
147d0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
147e0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
147f0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
14800 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14810 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
14820 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14830 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14840 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14850 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14860 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14870 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14880 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
148a0 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
148b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
148c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
148d0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
148e0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
148f0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14900 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14920 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14930 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14940 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14950 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14960 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14970 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14980 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14990 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
149a0 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
149b0 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
149c0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
149d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
149e0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
149f0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14a00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14a10 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14a20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14a30 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14a40 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14a50 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14a60 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14a70 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14a80 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14a90 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14aa0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14ab0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14ac0 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ad0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14ae0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14af0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14b00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14b10 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14b20 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14b30 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14b40 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14b50 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14b60 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14b70 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14b80 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14b90 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14ba0 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14bb0 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14bc0 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14bd0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14be0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14bf0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14c00 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14c10 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14c20 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14c30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14c40 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14c50 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14c60 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14c70 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14c80 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14c90 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14ca0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14cb0 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14cc0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14cd0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14ce0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14cf0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14d00 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14d10 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14d20 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14d30 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14d40 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14d50 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14d60 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14d70 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14d80 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14d90 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14da0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14db0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14dc0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14dd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14de0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14df0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14e00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14e10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14e20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
14e30 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
14e40 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
14e50 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14e60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
14e70 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
14e80 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14e90 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
14ea0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
14ec0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14ed0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
14ee0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
14ef0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14f00 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
14f10 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
14f20 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
14f30 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14f40 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14f60 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14f70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14f80 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14f90 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
14fa0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
14fb0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
14fc0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
14fd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
14fe0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
14ff0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15000 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15010 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15020 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15030 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15040 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15050 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15060 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15070 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15080 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15090 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
150a0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
150b0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
150c0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
150d0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
150e0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
150f0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15100 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15110 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15120 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15130 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15140 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15150 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15160 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15170 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15180 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15190 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
151a0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
151b0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
151c0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
151d0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
151e0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
151f0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15200 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15210 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15220 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15230 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15240 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15250 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15260 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15270 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15280 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15290 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
152a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
152b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
152c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
152d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
152e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
152f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15300 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15310 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15320 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15330 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15340 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15350 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15360 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15370 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15380 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15390 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
153a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
153b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
153c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
153d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
153e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
153f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
15400 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
15410 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
15420 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15430 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15440 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15450 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15460 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15470 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15480 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15490 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
154a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
154b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
154c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
154d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
154e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
154f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
15500 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15530 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15540 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15550 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15560 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15570 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15580 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15590 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
155a0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
155b0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
155c0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
155d0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
155e0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
155f0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15600 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15610 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15620 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
15630 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
15640 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
15650 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
15660 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
15670 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
15680 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15690 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
156a0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
156b0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
156c0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
156d0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
156e0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
156f0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15700 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15710 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15720 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
15730 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15740 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
15750 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15760 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15770 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
15780 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
15790 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
157a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
157b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
157c0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
157d0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
157e0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
157f0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15800 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15810 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15820 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
15830 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
15840 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
15850 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
15860 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
15870 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
15880 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
15890 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
158a0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
158b0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
158c0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
158d0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
158e0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
158f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15900 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15910 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15920 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15930 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
15940 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
15950 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15960 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
15970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
15980 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
15990 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
159a0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
159b0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
159c0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
159d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
159e0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
159f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15a00 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
15a10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15a20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15a30 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15a40 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
15a50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
15a60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
15a70 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
15a80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
15a90 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
15aa0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
15ab0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
15ac0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
15ad0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
15ae0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
15af0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15b00 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15b10 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15b20 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15b40 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15b50 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15b60 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15b70 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15b80 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15b90 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
15ba0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
15bb0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
15bc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
15bd0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
15be0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15bf0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15c00 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15c10 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15c20 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15c30 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15c40 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15c50 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15c60 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15c70 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15c80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15c90 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
15ca0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
15cb0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
15cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15cd0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
15ce0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15cf0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d10 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15d20 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15d30 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15d60 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15d70 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15d80 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
15da0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
15db0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
15dc0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
15dd0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
15de0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
15df0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15e00 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15e10 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15e20 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15e30 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15e40 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15e50 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15e60 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15e80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15e90 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
15ea0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
15eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ec0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15ed0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
15ee0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
15ef0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f10 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15f20 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15f30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15f40 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15f50 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15f60 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15f80 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
15fb0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
15fc0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
15fd0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
15fe0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
15ff0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
16000 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
16010 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
16020 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
16030 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
16040 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16050 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
16060 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
16070 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
16080 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
16090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
160a0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
160b0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
160c0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
160d0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
160e0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
160f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
16100 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
16110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16120 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
16130 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
16140 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
16150 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
16160 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
16170 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
16180 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
16190 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
161a0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
161b0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
161c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
161d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
161e0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
161f0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
16200 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
16210 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
16220 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
16230 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16240 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
16250 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16260 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
16270 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
16280 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
16290 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
162a0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
162b0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
162c0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
162d0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
162e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
162f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16300 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16310 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16320 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
16330 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
16340 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
16350 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
16360 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
16370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16380 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16390 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
163a0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
163b0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
163c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
163d0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
163e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
163f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
16400 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
16410 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
16420 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
16430 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16440 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
16450 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
16460 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
16470 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
16480 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
16490 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
164a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
164b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
164c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
164d0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
164e0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
164f0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16500 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16520 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
16530 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
16540 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
16550 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
16560 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
16570 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
16580 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
16590 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
165a0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
165b0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
165c0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
165d0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
165e0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
165f0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16600 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16610 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16620 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
16630 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
16640 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
16650 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
16660 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
16670 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
16680 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
16690 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
166a0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
166b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
166c0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
166d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
166e0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
166f0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16700 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16710 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16720 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
16730 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
16740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16750 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
16760 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
16770 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16780 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
16790 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
167a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
167b0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
167c0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
167d0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
167e0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
167f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16800 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16810 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16820 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16830 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
16840 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  ck before during
16850 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
16860 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16870 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16880 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16890 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
168a0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
168b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
168c0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
168d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
168f0 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16900 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
16910 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
16920 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
16930 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
16940 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
16950 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
16960 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16970 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16980 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16990 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
169a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
169b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
169c0 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
169d0 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
169e0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
169f0 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16a00 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
16a10 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
16a20 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
16a30 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
16a40 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
16a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16a60 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
16a70 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
16a80 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16a90 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
16aa0 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
16ab0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
16ac0 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
16ad0 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
16ae0 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
16af0 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16b00 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
16b10 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16b20 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
16b30 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16b40 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
16b50 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
16b60 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
16b70 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
16b80 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
16b90 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
16ba0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
16bb0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
16bc0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
16bd0 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
16be0 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
16bf0 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16c00 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
16c10 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
16c20 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
16c30 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
16c40 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
16c50 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
16c60 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
16c70 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
16c80 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16c90 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
16ca0 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
16cb0 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
16cc0 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
16cd0 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
16ce0 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
16cf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16d00 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16d10 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16d20 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16d30 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16d40 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16d50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
16d60 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
16d70 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
16d80 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16d90 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
16da0 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
16db0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16dc0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16dd0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16de0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16df0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16e00 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16e10 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16e20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16e30 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16e40 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16e50 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
16e60 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
16e70 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
16e80 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16e90 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
16ea0 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
16eb0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16ec0 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16ed0 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16ee0 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16ef0 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16f00 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16f10 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16f20 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16f30 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16f40 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16f50 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
16f60 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16f70 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
16f80 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16f90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16fa0 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16fb0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16fc0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16fd0 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16fe0 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16ff0 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
17000 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
17010 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
17020 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
17030 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
17040 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
17050 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
17060 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
17070 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
17080 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
17090 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
170a0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
170b0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
170c0 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
170d0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
170e0 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
170f0 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
17100 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
17110 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
17120 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
17130 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
17140 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
17150 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
17160 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
17170 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
17180 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
17190 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
171a0 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
171b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
171c0 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
171d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
171e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
171f0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
17200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
17210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
17220 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
17230 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
17240 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
17250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17260 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
17270 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d  GER_OPEN || pPg=
17280 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
17290 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
172a0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
172b0 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
172c0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
172d0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
172e0 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
172f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
17300 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
17310 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
17320 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
17330 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
17340 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
17350 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
17360 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
17370 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
17380 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
17390 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
173a0 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
173b0 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
173c0 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
173d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
173e0 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  ));.  }.  if( is
173f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17400 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
17410 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
17420 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
17430 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
17440 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20  GER_OPEN).   && 
17450 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20  isSynced.  ){.  
17460 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67    i64 ofst = (pg
17470 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
17480 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
17490 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61   testcase( !isSa
174a0 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20  vepnt && pPg!=0 
174b0 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
174c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
174d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
174e0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
174f0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
17500 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
17510 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
17520 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
17530 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
17540 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
17550 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
17560 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
17570 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
17580 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
17590 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
175a0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
175b0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
175c0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
175d0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
175e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
175f0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17600 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
17610 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
17620 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
17630 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
17640 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
17650 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
17660 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
17670 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
17680 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
17690 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
176a0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
176b0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
176c0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
176d0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
176e0 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
176f0 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17700 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17710 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17720 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17730 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17740 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17750 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17760 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17770 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17780 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17790 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
177a0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
177b0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
177c0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
177d0 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
177e0 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
177f0 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17800 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17810 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17820 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17830 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17840 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17850 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17860 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17870 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17880 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17890 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
178a0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
178b0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
178c0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
178d0 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
178e0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
178f0 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17900 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17910 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17920 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17930 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17940 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17950 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17960 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17970 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17980 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17990 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
179a0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
179b0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
179c0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
179d0 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
179e0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
179f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17a00 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17a10 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17a20 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17a30 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17a40 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
17a50 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
17a60 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
17a70 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
17a80 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
17a90 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
17aa0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
17ab0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17ac0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17ad0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
17ae0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17af0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
17b00 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
17b10 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
17b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17b30 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
17b40 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
17b50 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17b60 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17b70 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
17b80 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
17b90 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
17ba0 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
17bb0 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
17bc0 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
17bd0 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
17be0 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
17bf0 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
17c00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
17c10 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
17c20 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
17c30 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
17c40 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
17c50 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
17c60 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
17c70 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
17c80 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
17c90 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
17ca0 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
17cb0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
17cc0 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
17cd0 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
17ce0 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
17cf0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
17d00 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
17d10 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17d20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
17d30 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
17d40 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
17d50 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
17d60 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
17d70 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
17d80 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
17d90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
17da0 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
17db0 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
17dc0 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
17dd0 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
17de0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17df0 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
17e00 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
17e10 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
17e20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
17e30 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
17e40 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
17e50 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
17e60 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
17e70 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
17e80 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
17e90 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
17ea0 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
17eb0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
17ec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17ed0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
17ee0 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
17ef0 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
17f00 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
17f10 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
17f20 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
17f30 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
17f40 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
17f50 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
17f60 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
17f70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
17f80 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17f90 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
17fa0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
17fb0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
17fc0 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
17fd0 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
17fe0 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
17ff0 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
18000 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
18010 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
18020 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
18030 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
18040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18050 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
18060 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
18070 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
18080 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18090 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
180a0 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
180b0 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
180c0 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
180d0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
180e0 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
180f0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
18100 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
18110 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
18120 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
18130 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
18140 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
18150 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
18160 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
18170 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18180 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
18190 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
181a0 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
181b0 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
181c0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
181d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
181e0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
181f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
18200 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
18210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18220 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18230 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
18240 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
18250 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
18260 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
18270 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
18280 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
18290 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
182a0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
182b0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
182c0 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
182d0 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
182e0 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
182f0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
18300 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
18310 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
18320 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
18330 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
18340 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
18350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
18360 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
18370 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
18380 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
18390 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
183a0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
183b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
183c0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
183d0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
183e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
183f0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
18400 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
18410 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
18420 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
18430 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
18440 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
18450 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
18460 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18470 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
18480 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
18490 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
184a0 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
184b0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
184c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
184d0 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
184e0 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
184f0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
18500 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
18510 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
18520 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
18530 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
18540 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
18550 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
18560 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
18570 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
18580 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
18590 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
185a0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
185b0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
185c0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
185d0 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
185e0 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
185f0 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
18600 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
18610 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
18620 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
18630 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
18640 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
18650 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
18660 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
18670 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
18680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
18690 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
186a0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
186b0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
186c0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
186d0 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
186e0 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
186f0 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
18700 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
18710 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
18720 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
18730 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
18740 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
18750 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
18760 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
18770 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
18780 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
18790 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
187a0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
187b0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
187c0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
187d0 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
187e0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
187f0 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
18800 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
18810 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
18820 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
18830 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18840 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
18850 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
18860 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18870 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
18880 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
18890 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
188a0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
188b0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
188c0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
188d0 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
188e0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
188f0 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
18900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18910 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
18920 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
18930 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
18940 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
18950 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18960 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
18970 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
18980 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
18990 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
189a0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
189b0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
189c0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
189d0 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
189e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
189f0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
18a00 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
18a10 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
18a20 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
18a30 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
18a40 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
18a50 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
18a60 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
18a70 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
18a80 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
18a90 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
18aa0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
18ab0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
18ac0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
18ad0 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
18ae0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
18af0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
18b00 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18b10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18b20 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
18b30 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
18b40 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
18b50 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
18b60 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
18b70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
18b80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18b90 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
18ba0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18bb0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18bc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18bd0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18be0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
18c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18c20 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
18c30 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
18c40 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
18c50 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
18c60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
18c70 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
18c80 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
18c90 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18ca0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
18cb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
18cc0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
18cd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18ce0 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
18cf0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
18d00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
18d10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18d20 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
18d30 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
18d40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
18d50 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
18d60 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
18d70 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
18d80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18d90 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
18da0 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
18db0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18dc0 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
18de0 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
18df0 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
18e00 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
18e10 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
18e20 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
18e30 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
18e40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18e50 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
18e60 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
18e70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18e80 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
18e90 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
18ea0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18eb0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18ec0 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
18ed0 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
18ee0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
18ef0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
18f00 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
18f10 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
18f20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
18f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
18f40 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
18f50 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18f60 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
18f70 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
18f80 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
18f90 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
18fa0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18fb0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
18fc0 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
18fd0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18fe0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18ff0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
19000 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
19010 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
19020 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
19030 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
19040 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
19050 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
19060 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
19070 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
19080 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
19090 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
190a0 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
190b0 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
190c0 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
190d0 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
190e0 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
190f0 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
19100 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
19110 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19120 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
19130 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
19140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19150 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19160 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
19170 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
19180 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
19190 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
191a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73  lite3Malloc(nMas
191b0 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
191c0 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
191d0 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
191e0 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
191f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19200 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19210 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
19220 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
19230 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
19240 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
19250 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
19260 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
19270 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
19280 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
19290 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
192a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
192b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
192c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
192d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
192e0 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
192f0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
19300 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
19310 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
19320 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
19330 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
19340 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
19350 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
19360 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
19370 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
19380 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
19390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
193a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
193b0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
193c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
193d0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
193e0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
193f0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
19400 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
19410 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
19420 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
19430 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
19440 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
19450 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
19460 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
19470 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
19480 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
19490 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
194a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
194b0 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
194c0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
194d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
194e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
194f0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
19500 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19510 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
19520 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
19530 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
19540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19550 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19560 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19570 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
19580 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
19590 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
195a0 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
195b0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
195c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
195d0 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
195e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
195f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19600 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19610 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
19620 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
19630 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
19640 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
19650 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
19660 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
19670 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
19680 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
19690 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
196a0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
196b0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
196c0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
196d0 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
196e0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
196f0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
19700 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
19710 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19720 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
19730 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
19740 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
19750 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
19760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
19770 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
19780 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
19790 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
197a0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
197b0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
197c0 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
197d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
197e0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
197f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19810 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
19820 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
19830 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19840 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
19850 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
19860 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
19870 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
19880 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
19890 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
198a0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
198b0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
198c0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
198d0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
198e0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
198f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
19900 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
19910 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
19920 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
19930 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
19940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19950 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
19960 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
19970 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
19980 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
19990 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
199a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
199b0 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
199c0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
199d0 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
199e0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
199f0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
19a00 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
19a10 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
19a20 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
19a30 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
19a40 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
19a50 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
19a60 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
19a70 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
19a80 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
19a90 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
19aa0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
19ab0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
19ac0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
19ad0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
19ae0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
19af0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
19b00 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
19b10 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
19b20 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
19b30 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
19b40 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
19b50 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
19b60 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
19b70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
19b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
19b90 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
19ba0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
19bb0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
19bc0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
19bd0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
19be0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19bf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19c00 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
19c10 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19c20 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
19c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19c50 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
19c60 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
19c70 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19c80 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
19c90 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
19ca0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
19cb0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
19cc0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
19cd0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
19ce0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
19cf0 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
19d00 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
19d10 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
19d20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
19d30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19d40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19d50 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
19d60 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
19d70 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
19d80 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
19d90 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
19da0 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
19db0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
19dc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
19dd0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
19de0 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
19df0 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
19e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e10 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
19e20 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
19e30 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
19e40 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
19e50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19e60 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
19e70 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
19e80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
19e90 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
19ea0 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
19eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
19ec0 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
19ed0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
19ee0 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
19ef0 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
19f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19f10 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19f20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
19f30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19f40 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
19f50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
19f60 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
19f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19f80 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
19f90 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
19fa0 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
19fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19fd0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
19fe0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
19ff0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1a000 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a020 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1a030 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1a040 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1a050 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1a060 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1a070 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1a080 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1a090 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1a0a0 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1a0b0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1a0c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1a0d0 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1a0e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1a0f0 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1a100 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1a110 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1a120 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1a130 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a140 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1a150 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1a160 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1a170 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1a180 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1a190 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1a1a0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1a1b0 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1a1c0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1a1d0 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1a1e0 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1a1f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1a200 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1a210 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1a220 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1a230 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1a240 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1a250 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1a260 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1a270 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1a280 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1a290 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1a2a0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1a2b0 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1a2c0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1a2d0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1a2e0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1a2f0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a300 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1a310 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1a320 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1a330 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1a340 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a350 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1a360 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a370 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a380 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1a390 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1a3a0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1a3b0 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1a3c0 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1a3d0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1a3e0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1a3f0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1a400 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1a410 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1a420 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1a430 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a440 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1a450 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1a460 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a470 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1a480 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1a490 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1a4a0 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1a4b0 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1a4c0 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1a4d0 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1a4e0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1a4f0 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1a500 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1a510 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1a520 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1a530 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1a540 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a550 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1a560 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1a570 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1a580 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a590 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1a5a0 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1a5b0 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1a5c0 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1a5d0 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1a5e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1a5f0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1a600 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1a610 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1a620 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1a630 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1a640 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1a650 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1a660 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1a670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1a680 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1a690 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1a6a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a6b0 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1a6c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1a6d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1a6e0 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1a6f0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1a700 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1a710 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1a720 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1a730 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1a740 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a750 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1a760 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1a770 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1a780 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1a790 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1a7a0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1a7b0 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1a7c0 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1a7d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a7e0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1a7f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1a800 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1a810 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1a820 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1a830 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1a840 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1a850 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1a860 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1a870 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1a880 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1a890 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1a8a0 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1a8b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1a8c0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1a8d0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1a8e0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1a8f0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1a900 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1a910 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1a920 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a930 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a940 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1a950 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1a960 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1a970 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1a980 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1a990 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1a9a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1a9b0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1a9c0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1a9d0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1a9e0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1a9f0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1aa00 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1aa10 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1aa20 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1aa30 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1aa40 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1aa50 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1aa60 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1aa70 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1aa80 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1aa90 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1aaa0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1aab0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1aac0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1aad0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1aae0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1aaf0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1ab00 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1ab10 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1ab20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1ab30 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1ab40 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1ab50 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1ab60 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1ab70 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1ab80 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1ab90 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1aba0 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1abb0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1abc0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1abd0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1abe0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1abf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1ac00 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1ac10 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1ac20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1ac30 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1ac40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ac50 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1ac60 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1ac70 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1ac80 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1ac90 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1aca0 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1acb0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1acc0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1acd0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1ace0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1acf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1ad00 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1ad10 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1ad20 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1ad30 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1ad40 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1ad50 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1ad60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1ad70 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1ad80 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1ad90 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1ada0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1adb0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1adc0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1add0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1ade0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1adf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1ae00 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1ae10 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1ae20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1ae30 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1ae40 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1ae50 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1ae60 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1ae70 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1ae80 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1ae90 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1aea0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1aeb0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1aec0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1aed0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1aee0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1aef0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1af00 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1af10 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1af20 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1af30 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1af40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1af50 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1af60 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1af70 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1af80 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1af90 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1afa0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1afb0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1afc0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1afd0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1afe0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1aff0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b000 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1b010 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1b020 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1b030 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1b040 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1b050 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1b060 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1b070 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1b080 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1b090 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1b0a0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1b0b0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1b0c0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1b0d0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1b0e0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1b0f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1b100 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1b110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1b120 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1b130 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1b140 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1b150 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1b160 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1b170 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1b180 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1b190 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1b1a0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1b1b0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1b1c0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1b1d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b1e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1b1f0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1b200 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1b210 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1b220 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1b230 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1b240 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1b250 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1b260 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1b270 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1b280 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1b290 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1b2a0 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1b2b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1b2c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b2d0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1b2e0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1b2f0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1b300 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1b310 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1b320 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1b330 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1b340 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1b350 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1b360 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1b370 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b380 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1b390 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b3a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1b3b0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3d0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1b3e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1b3f0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1b420 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1b430 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1b460 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1b470 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1b480 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b490 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1b4a0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1b4b0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1b4e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b4f0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1b500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1b510 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1b520 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1b530 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1b540 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1b550 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1b560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1b570 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1b580 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1b590 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1b5a0 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1b5b0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1b5c0 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1b5d0 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1b5e0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1b5f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1b600 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1b610 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  al */..  /* Figu
1b620 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1b630 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1b640 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1b650 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1b660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b670 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1b680 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1b690 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1b6a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1b6b0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1b6c0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1b6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b6e0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1b6f0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1b700 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1b710 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1b720 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1b730 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1b740 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1b750 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b760 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1b770 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1b780 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1b790 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1b7a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1b7b0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1b7c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b7d0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1b7e0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1b7f0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1b800 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1b810 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1b820 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1b830 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1b840 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1b850 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1b860 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1b870 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1b880 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1b890 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1b8a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b8b0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1b8c0 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
1b8d0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1b8e0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1b8f0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1b900 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1b910 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1b920 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1b930 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1b940 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1b950 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1b960 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1b970 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1b980 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1b990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b9a0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1b9b0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1b9c0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1b9d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1b9e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1b9f0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1ba00 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1ba10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ba20 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1ba30 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ba40 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1ba50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1ba60 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1ba70 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1ba80 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1ba90 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1baa0 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1bab0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1bac0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1bad0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1bae0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1baf0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1bb00 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1bb10 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1bb20 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1bb30 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1bb40 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1bb50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1bb60 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1bb70 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1bb80 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1bb90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1bba0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1bbb0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1bbc0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1bbd0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1bbe0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1bbf0 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1bc00 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1bc10 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1bc20 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1bc30 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1bc40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1bc50 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1bc60 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1bc70 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1bc80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bc90 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1bca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1bcb0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1bcc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1bcd0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1bce0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bcf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1bd00 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1bd10 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1bd20 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1bd30 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1bd40 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1bd50 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1bd60 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1bd70 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1bd80 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1bd90 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1bda0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1bdb0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1bdc0 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1bdd0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1bde0 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1bdf0 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1be00 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1be10 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1be20 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1be30 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1be40 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1be50 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1be60 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1be70 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1be80 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1be90 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1bea0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1beb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1bec0 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1bed0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1bee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1bef0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1bf00 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1bf10 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1bf20 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1bf30 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1bf40 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1bf50 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1bf60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1bf70 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1bf80 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1bf90 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1bfa0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1bfb0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1bfc0 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1bfd0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1bfe0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1bff0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1c000 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1c010 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1c020 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1c030 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1c040 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1c050 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1c060 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1c070 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1c080 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1c090 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1c0a0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1c0b0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1c0c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1c0d0 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1c0e0 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1c0f0 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1c100 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1c110 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1c120 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1c130 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1c140 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c150 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1c160 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1c170 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1c180 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1c190 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1c1a0 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1c1b0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1c1c0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1c1d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1c1e0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1c1f0 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1c200 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1c210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1c220 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1c230 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1c240 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1c250 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1c260 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1c270 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1c280 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1c290 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1c2a0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c2b0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1c2c0 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1c2d0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1c2e0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1c2f0 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1c300 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1c310 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1c330 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1c340 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c350 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c360 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1c370 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1c380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c3a0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c3b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c3c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1c3d0 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1c3e0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1c3f0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1c400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1c410 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1c420 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c430 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1c440 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1c450 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1c460 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1c470 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1c480 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1c490 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1c4a0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1c4b0 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1c4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1c4d0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1c4e0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1c4f0 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1c500 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1c510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c530 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1c540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c560 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1c570 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c580 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1c590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c5a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1c5c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1c5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1c5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1c5f0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1c600 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1c610 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1c620 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1c630 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1c640 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1c650 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1c660 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1c670 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1c680 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1c690 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1c6a0 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1c6b0 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1c6c0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1c6d0 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1c6e0 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1c6f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1c700 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1c710 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1c720 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1c730 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1c740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c750 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1c760 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1c770 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c780 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1c790 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1c7a0 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1c7b0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1c7c0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1c7d0 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1c7e0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1c7f0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1c800 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1c810 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1c820 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1c830 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1c840 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1c850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1c860 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1c870 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1c880 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1c890 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1c8a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1c8b0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c8c0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1c8d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c8e0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1c8f0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1c900 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1c910 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1c920 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1c930 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1c940 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1c950 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1c960 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1c970 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1c980 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1c990 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1c9a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c9b0 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1c9c0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1c9d0 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1c9e0 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1c9f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ca00 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1ca10 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1ca20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ca30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1ca40 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1ca50 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1ca60 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1ca70 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1ca80 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1ca90 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1caa0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1cab0 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1cac0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1cad0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1cae0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1caf0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1cb00 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1cb10 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cb20 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1cb30 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1cb40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cb50 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1cb60 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1cb70 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1cb80 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1cb90 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1cba0 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1cbb0 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1cbc0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1cbd0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1cbe0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1cbf0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1cc00 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1cc10 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1cc20 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1cc30 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1cc40 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1cc50 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1cc60 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1cc70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1cc80 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1cc90 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1cca0 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1ccb0 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1ccc0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1ccd0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1cce0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1ccf0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1cd00 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1cd10 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1cd20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd30 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1cd40 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1cd50 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1cd60 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1cd70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1cd80 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1cd90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1cda0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1cdb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cdc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1cdd0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1cde0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1cdf0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1ce00 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1ce10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1ce20 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1ce30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1ce40 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nc(pPager, 0);. 
1ce50 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1ce60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1ce70 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1ce80 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1ce90 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1cea0 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63  ', 0);.    testc
1ceb0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1cec0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1ced0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cee0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1cef0 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1cf00 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1cf10 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1cf20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1cf30 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1cf40 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1cf50 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1cf60 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1cf70 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1cf80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1cf90 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1cfa0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1cfb0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1cfc0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1cfd0 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20  .  if( isHot && 
1cfe0 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20  nPlayback ){.   
1cff0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1d000 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
1d010 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65  ER_ROLLBACK, "re
1d020 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73  covered %d pages
1d030 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20   from %s",.     
1d040 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79             nPlay
1d050 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  back, pPager->zJ
1d060 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  ournal);.  }..  
1d070 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
1d080 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1d090 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1d0a0 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
1d0b0 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
1d0c0 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
1d0d0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
1d0e0 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
1d0f0 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
1d100 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
1d110 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
1d120 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
1d130 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
1d140 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1d150 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1d160 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1d170 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
1d180 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1d190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d1a0 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
1d1b0 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
1d1c0 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
1d1d0 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
1d1e0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d1f0 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
1d200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d210 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1d220 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
1d230 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
1d240 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
1d250 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
1d260 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
1d270 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
1d280 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1d290 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
1d2a0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1d2b0 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
1d2c0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1d2d0 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
1d2e0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
1d2f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1d300 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1d310 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20  age(PgHdr *pPg, 
1d320 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50  u32 iFrame){.  P
1d330 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1d340 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1d350 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1d360 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1d370 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1d380 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1d390 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1d3a0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1d3b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d3c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1d3d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d3e0 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1d3f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1d400 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1d410 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1d420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d430 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1d440 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1d450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1d460 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1d470 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1d480 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69  ITE_OMIT_WAL.  i
1d490 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20  f( iFrame ){.   
1d4a0 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1d4b0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1d4c0 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1d4d0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1d4e0 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1d4f0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1d500 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70   iFrame, pgsz, p
1d510 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1d520 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1d530 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1d540 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1d550 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1d560 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d570 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1d580 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
1d590 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a  pgsz, iOffset);.
1d5a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d5b0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1d5c0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
1d5d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d5e0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67   }.  }..  if( pg
1d5f0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1d600 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1d610 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1d620 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1d630 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1d640 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1d650 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1d660 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1d670 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1d680 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1d690 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1d6a0 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1d6b0 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d6c0 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1d6d0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1d6e0 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1d6f0 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1d700 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1d710 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1d720 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1d730 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1d740 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1d750 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1d760 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1d770 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1d780 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d790 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1d7a0 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1d7b0 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1d7c0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1d7d0 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1d7e0 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1d7f0 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1d800 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1d810 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1d820 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1d830 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1d840 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1d850 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1d860 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1d870 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1d880 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1d890 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1d8a0 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1d8b0 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1d8c0 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1d8d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d8e0 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1d8f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d900 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1d910 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1d920 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1d930 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1d940 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1d950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d960 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1d970 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1d980 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1d990 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1d9a0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1d9b0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1d9c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1d9d0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1d9e0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1d9f0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1da00 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1da10 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1da20 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1da30 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1da40 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1da50 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1da60 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1da70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1da80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1da90 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1daa0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1dab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dac0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1dad0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1dae0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1daf0 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1db00 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1db10 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1db20 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1db30 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1db40 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1db50 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1db60 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1db70 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1db80 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1db90 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1dba0 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1dbb0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1dbc0 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1dbd0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1dbe0 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1dbf0 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1dc00 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1dc10 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1dc20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dc30 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1dc40 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1dc50 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1dc60 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1dc70 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1dc80 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1dc90 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1dca0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1dcb0 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1dcc0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1dcd0 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1dce0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1dcf0 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1dd00 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1dd10 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1dd20 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1dd30 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1dd40 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1dd50 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1dd60 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1dd70 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1dd80 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1dd90 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1dda0 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1ddb0 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1ddc0 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1ddd0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dde0 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1ddf0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1de00 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1de10 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1de20 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1de30 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1de40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1de50 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1de60 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1de70 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1de80 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1de90 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1dea0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1deb0 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1dec0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ded0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1dee0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1def0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1df00 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1df10 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1df20 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1df30 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1df40 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1df50 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1df60 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1df70 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1df80 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1df90 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1dfa0 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1dfb0 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1dfc0 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1dfd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1dfe0 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1dff0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e000 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e010 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e020 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e030 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e040 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e060 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e070 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e080 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e090 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e0a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e0b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e0c0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e0d0 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e0e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e0f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e100 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e110 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e120 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e130 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e140 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e150 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e160 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e170 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e180 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e190 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e1a0 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e1b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e1c0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e1e0 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e1f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e200 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e210 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e220 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e250 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e260 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e290 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e2a0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e2b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e2c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e2d0 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e2e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e2f0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e300 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e310 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e320 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e330 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e340 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e350 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e360 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e370 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e380 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e390 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e3a0 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e3b0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e3c0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e3d0 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e3e0 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e3f0 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e400 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e410 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e420 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e430 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e440 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e450 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1e460 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1e470 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1e480 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1e490 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1e4a0 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1e4b0 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1e4c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1e4d0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1e4e0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1e4f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e500 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e510 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e520 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1e530 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1e540 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e550 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1e560 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1e570 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e580 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e5a0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1e5b0 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e5d0 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1e5e0 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1e5f0 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1e600 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e610 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1e620 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1e630 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1e640 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1e650 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1e660 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1e670 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1e680 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1e690 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1e6a0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1e6b0 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1e6c0 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1e6d0 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1e6e0 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1e6f0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1e700 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1e710 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1e720 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1e730 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1e740 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1e750 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1e760 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1e770 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1e780 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1e790 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1e7a0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1e7b0 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1e7c0 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1e7d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1e7e0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1e7f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1e800 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1e810 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1e820 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1e830 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1e840 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1e850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e860 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e870 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1e880 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1e890 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1e8a0 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1e8b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1e8c0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1e8d0 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1e8e0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1e8f0 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1e900 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1e910 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1e920 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1e930 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1e940 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1e950 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1e960 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1e970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e980 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1e990 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1e9a0 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1e9b0 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1e9c0 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1e9d0 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1e9e0 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1e9f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ea00 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1ea10 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea30 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1ea40 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1ea70 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1ea80 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1eab0 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1eac0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1ead0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1eae0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1eaf0 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1eb00 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1eb10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1eb30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1eb40 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1eb70 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1eb80 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1ebb0 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1ebc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ebd0 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1ebe0 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1ebf0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ec00 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1ec10 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1ec20 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1ec30 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1ec40 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1ec50 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1ec60 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1ec70 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1ec80 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1ec90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1eca0 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1ecb0 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1ecc0 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1ecd0 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1ece0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1ecf0 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1ed00 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1ed10 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1ed20 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1ed30 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1ed40 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1ed50 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1ed60 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1ed70 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1ed80 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1ed90 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1eda0 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1edb0 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1edc0 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1edd0 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1ede0 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1edf0 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 20     nList = 0;.. 
1ee00 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1ee10 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1ee20 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ee30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1ee40 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1ee50 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1ee60 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1ee70 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1ee80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ee90 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1eea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1eeb0 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1eec0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1eed0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1eee0 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1eef0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1ef00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1ef10 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1ef20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ef30 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1ef40 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1ef50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ef60 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1ef70 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1ef80 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1ef90 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1efa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1efb0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1efc0 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1efd0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1efe0 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1eff0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1f000 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1f010 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1f020 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1f030 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f040 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1f050 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1f060 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1f070 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f080 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1f090 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f0a0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1f0b0 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1f0c0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1f0d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1f0e0 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1f0f0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1f100 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1f110 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1f120 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1f130 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1f140 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1f150 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1f160 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1f170 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1f180 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1f190 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1f1a0 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1f1b0 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1f1c0 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1f1d0 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1f1e0 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1f1f0 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1f200 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1f210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f220 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1f230 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1f240 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f250 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f270 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1f280 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1f2b0 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1f2c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1f2d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f2f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f300 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1f310 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f320 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1f330 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1f340 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1f350 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1f360 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1f370 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1f380 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1f390 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1f3a0 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1f3b0 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1f3c0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1f3d0 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1f3e0 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1f3f0 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1f400 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1f410 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1f420 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1f430 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1f440 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1f450 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1f460 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1f470 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f480 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1f490 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f4a0 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1f4b0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1f4c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1f4d0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
1f4e0 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
1f4f0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1f500 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1f510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f520 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f530 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f540 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1f550 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1f560 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1f570 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1f580 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1f590 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1f5a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f5b0 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1f5c0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1f5d0 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1f5e0 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1f5f0 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1f600 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1f610 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1f620 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f640 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1f650 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1f660 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1f670 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1f680 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1f690 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f6a0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1f6b0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f6c0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f6e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f6f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f700 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f710 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f730 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f740 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f750 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f760 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1f770 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f780 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1f790 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1f7a0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1f7b0 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1f7c0 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1f7d0 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1f7e0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1f7f0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f800 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1f810 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f820 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1f830 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f840 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1f850 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1f860 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1f870 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1f880 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1f890 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1f8a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f8b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f8c0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f8d0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f8e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1f8f0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1f900 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1f910 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1f920 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1f930 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1f940 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
1f950 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
1f960 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
1f970 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
1f980 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
1f990 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
1f9a0 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1f9b0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1f9c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f9d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1f9e0 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
1f9f0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
1fa00 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
1fa10 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
1fa20 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
1fa30 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36  age==0 ){.    i6
1fa40 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fa60 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
1fa70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61  n bytes */.    a
1fa80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1fa90 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1faa0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1fab0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
1fac0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1fad0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
1fae0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1faf0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
1fb00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fb10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fb30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fb40 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
1fb50 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
1fb60 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
1fb70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
1fb80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1fb90 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1fba0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1fbb0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1fbc0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
1fbd0 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1fbe0 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1fbf0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1fc00 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1fc10 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1fc20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1fc30 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1fc40 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1fc50 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1fc60 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1fc70 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
1fc80 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1fc90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1fca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fcb0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
1fcc0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
1fcd0 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
1fce0 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
1fcf0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
1fd00 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
1fd10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fd20 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
1fd30 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
1fd40 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
1fd50 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
1fd60 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
1fd70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fd80 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
1fd90 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1fda0 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
1fdb0 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
1fdc0 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
1fdd0 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
1fde0 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
1fdf0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1fe00 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
1fe10 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1fe20 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
1fe30 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
1fe40 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
1fe50 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
1fe60 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
1fe70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
1fe80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1fe90 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
1fea0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1feb0 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
1fec0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
1fed0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fee0 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
1fef0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
1ff00 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
1ff10 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1ff20 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
1ff30 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
1ff40 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
1ff50 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
1ff60 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
1ff70 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
1ff80 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
1ff90 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
1ffa0 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
1ffb0 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
1ffc0 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
1ffd0 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
1ffe0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fff0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
20000 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
20010 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20020 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20030 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20040 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20050 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
20060 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
20070 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
20080 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
20090 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
200a0 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
200c0 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
200d0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
200e0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20100 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
20110 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
20120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
20130 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
20140 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
20150 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20160 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
20170 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20180 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
20190 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
201a0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
201b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
201c0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
201d0 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53  E_NOENT ) rc = S
201e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
201f0 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
20200 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20210 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20220 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
20230 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
20240 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
20250 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
20260 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
20270 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
20280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20290 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
202a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
202b0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
202c0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
202d0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
202e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
202f0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
20300 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
20310 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
20320 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20330 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20340 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
20350 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20360 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
20370 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
20380 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20390 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
203a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
203b0 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
203c0 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
203d0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
203e0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
203f0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
20400 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
20410 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
20420 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
20430 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
20440 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
20450 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
20460 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
20470 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
20480 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
20490 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
204a0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
204b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
204c0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
204d0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
204e0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
204f0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
20500 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
20510 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
20520 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
20530 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
20540 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
20550 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
20560 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
20570 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20580 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20590 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
205a0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
205b0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
205c0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
205d0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
205e0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
205f0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
20600 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
20610 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
20620 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
20630 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20640 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
20650 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
20660 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20670 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
20680 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
20690 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
206a0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
206b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
206c0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
206d0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
206e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
206f0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
20700 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
20710 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20720 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
20730 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
20740 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
20750 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
20760 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
20770 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
20780 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
20790 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
207a0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
207b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
207c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
207d0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
207e0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
207f0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
20800 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
20810 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
20820 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
20830 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
20840 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
20850 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
20860 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
20870 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
20880 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
20890 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
208a0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
208b0 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
208c0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
208d0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
208e0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
208f0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
20900 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
20910 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
20920 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
20930 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
20940 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
20950 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
20960 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
20970 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
20980 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
20990 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
209a0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
209b0 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
209c0 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
209d0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
209e0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
209f0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
20a00 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
20a10 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
20a20 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
20a30 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
20a40 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
20a50 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
20a60 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
20a70 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
20a80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20a90 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
20aa0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
20ab0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
20ac0 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
20ad0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
20ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
20af0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
20b00 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
20b10 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b30 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
20b40 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
20b50 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
20b60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20b70 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
20b80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
20b90 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
20ba0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
20bb0 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
20bc0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
20bd0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
20be0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20bf0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
20c00 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
20c10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
20c20 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
20c30 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
20c40 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
20c50 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
20c60 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
20c70 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
20c80 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
20c90 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
20ca0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
20cb0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
20cc0 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
20cd0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
20ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20cf0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
20d00 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
20d10 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
20d20 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
20d30 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
20d40 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
20d50 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
20d60 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
20d70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20d80 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
20d90 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
20da0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
20db0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
20dc0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20dd0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20de0 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
20df0 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
20e00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20e10 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
20e20 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
20e30 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
20e40 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
20e50 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
20e60 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
20e70 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
20e80 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
20e90 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
20ea0 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
20eb0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
20ec0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20ed0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
20ee0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20ef0 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
20f00 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
20f10 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
20f20 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
20f30 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
20f40 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
20f50 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
20f60 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
20f70 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
20f80 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
20f90 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
20fa0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
20fb0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
20fc0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
20fd0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
20fe0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20ff0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
21000 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
21010 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
21020 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
21030 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
21040 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
21050 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
21060 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
21070 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
21080 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
21090 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
210a0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
210b0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
210c0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
210d0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
210e0 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
210f0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
21100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21110 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
21120 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21130 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
21140 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21150 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
21160 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21170 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
21180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21190 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
211a0 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
211b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
211c0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
211d0 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
211e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
211f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21200 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21210 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21220 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21230 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21240 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21250 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21270 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
21280 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
21290 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
212a0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
212b0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
212c0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
212d0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
212e0 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
212f0 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
21300 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
21310 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
21320 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
21330 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
21340 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21350 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
21360 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
21370 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
21380 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
21390 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
213a0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
213b0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
213c0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
213d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
213e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
213f0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
21400 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
21410 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
21420 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
21430 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
21440 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
21450 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
21460 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
21470 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21480 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
21490 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
214a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
214b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
214c0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
214d0 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
214e0 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
214f0 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
21500 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
21510 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
21520 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
21530 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
21540 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
21550 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
21560 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
21570 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
21580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
21590 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
215a0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
215b0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
215c0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
215d0 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
215e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
215f0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
21600 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
21610 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
21620 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21630 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
21640 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
21650 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
21660 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21670 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21680 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
21690 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
216a0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
216b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
216c0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
216d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
216e0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
216f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
21700 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
21710 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
21720 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
21730 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
21740 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
21750 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
21760 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
21770 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
21780 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
21790 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
217a0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
217b0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
217c0 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
217d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
217e0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
217f0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21800 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21810 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
21820 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
21830 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
21840 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21850 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
21860 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21870 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
21880 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
21890 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
218a0 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
218b0 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
218c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
218d0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
218e0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
218f0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
21900 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
21910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
21920 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
21930 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21940 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
21950 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21960 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21970 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
21980 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
21990 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
219a0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
219b0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
219c0 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
219d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
219e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
219f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21a00 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
21a10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21a20 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
21a30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
21a40 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
21a50 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
21a60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21a70 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
21a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21a90 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
21aa0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
21ab0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
21ac0 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
21ad0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
21ae0 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
21af0 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
21b00 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
21b10 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
21b20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
21b30 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
21b40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21b50 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
21b60 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
21b70 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
21b80 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
21b90 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
21ba0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
21bb0 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
21bc0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21bd0 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
21be0 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
21bf0 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
21c00 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
21c10 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
21c20 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
21c30 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
21c40 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
21c50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
21c60 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21c70 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
21c80 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
21c90 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
21ca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21cb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21cc0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
21cd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21ce0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
21cf0 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
21d00 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
21d10 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
21d20 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
21d30 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
21d40 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
21d50 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
21d60 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
21d70 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
21d80 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
21d90 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
21da0 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
21db0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
21dc0 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
21dd0 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
21de0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
21df0 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
21e00 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
21e10 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
21e20 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
21e30 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
21e40 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
21e50 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
21e60 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
21e70 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
21e80 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
21e90 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
21ea0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
21eb0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
21ec0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
21ed0 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
21ee0 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21ef0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21f10 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21f20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21f30 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21f50 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21f60 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
21f70 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
21f80 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
21f90 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
21fa0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
21fb0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
21fc0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
21fd0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21fe0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21ff0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
22010 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
22020 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
22030 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
22040 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
22050 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
22060 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
22070 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
22080 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
22090 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
220a0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
220b0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
220c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
220d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
220e0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
220f0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
22100 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
22110 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22120 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
22130 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
22140 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22150 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
22160 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
22170 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
22180 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
221a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
221b0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
221c0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
221d0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
221e0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
221f0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
22200 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
22210 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
22220 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
22230 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
22240 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
22250 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22260 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
22270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
22280 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
22290 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
222a0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
222b0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
222c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
222d0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
222e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
222f0 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
22300 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
22310 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
22320 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
22330 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
22340 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
22350 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
22360 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
22370 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
22380 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
22390 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
223a0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
223b0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
223c0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
223d0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
223e0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
223f0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
22400 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
22410 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
22420 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
22430 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
22440 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
22450 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
22460 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
22470 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
22480 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
22490 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
224a0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
224b0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
224c0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
224d0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
224e0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
224f0 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
22500 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
22510 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
22520 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
22530 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
22540 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
22550 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
22560 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
22570 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
22580 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
22590 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
225a0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
225b0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
225c0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
225d0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
225e0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
225f0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22600 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22610 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
22620 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
22630 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
22640 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
22650 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
22660 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
22670 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
22680 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
22690 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
226a0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
226b0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
226c0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
226d0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
226e0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
226f0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22700 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
22710 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
22720 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
22730 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
22740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
22750 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
22760 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
22770 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
22780 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22790 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
227a0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
227b0 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
227c0 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
227d0 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
227e0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
227f0 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
22800 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
22810 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72  US_MASK;.  asser
22820 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
22830 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
22840 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
22850 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
22860 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
22870 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
22880 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
22890 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
228a0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
228b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
228c0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
228d0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
228e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
228f0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
22900 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
22910 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c  lags & PAGER_FUL
22920 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22930 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22940 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22950 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  LL;.    pPager->
22960 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22970 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22980 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
22990 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b  Flags & PAGER_CK
229a0 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  PT_FULLFSYNC ){.
229b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
229c0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
229d0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
229e0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
229f0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22a00 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
22a10 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
22a20 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22a30 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22a40 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
22a50 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22a60 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22a70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c   }.  pPager->wal
22a80 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  SyncFlags = pPag
22a90 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
22aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
22ab0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
22ac0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
22ad0 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52  s |= WAL_SYNC_TR
22ae0 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a  ANSACTIONS;.  }.
22af0 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20    if( pgFlags & 
22b00 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c  PAGER_CACHESPILL
22b10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22b20 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
22b30 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22b40 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22b50 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
22b60 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a   SPILLFLAG_OFF;.
22b70 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
22b80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
22b90 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
22ba0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
22bb0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
22bc0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
22bd0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
22be0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
22bf0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
22c00 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
22c10 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22c20 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
22c30 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22c40 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
22c50 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
22c60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
22c70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
22c80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
22c90 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22ca0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
22cb0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
22cc0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
22cd0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
22ce0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
22cf0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
22d00 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
22d10 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
22d20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
22d30 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
22d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22d50 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
22d60 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
22d70 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
22d80 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
22d90 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
22da0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
22db0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22dc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22dd0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
22de0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22df0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
22e00 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22e10 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
22e20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22e30 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
22e40 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
22e50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22e60 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
22e70 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
22e80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
22e90 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
22ea0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22eb0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
22ec0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
22ed0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
22ee0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
22ef0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
22f00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22f10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22f20 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
22f30 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
22f40 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
22f50 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
22f60 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
22f70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
22f80 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
22f90 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
22fa0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
22fb0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
22fc0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
22fd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
22fe0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
22ff0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23000 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
23010 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
23020 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
23030 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
23040 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
23050 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
23060 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
23070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23080 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
23090 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
230a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
230b0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
230c0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
230d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
230e0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
230f0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
23100 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
23110 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
23120 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
23130 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
23140 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
23150 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
23160 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
23170 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
23180 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
23190 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
231a0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
231b0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
231c0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
231d0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
231e0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
231f0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
23200 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
23210 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
23220 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
23230 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
23260 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
23270 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
23280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
232a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
232b0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
232c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
232d0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
232e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
232f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
23300 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
23310 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
23320 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
23330 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
23340 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
23350 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
23360 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
23370 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
23380 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
23390 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
233a0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
233b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
233c0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
233d0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
233e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
233f0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
23400 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
23410 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23420 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
23430 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
23440 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23460 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
23470 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
23480 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
23490 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
234a0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
234b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
234c0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
234d0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
234e0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
234f0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
23500 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20  yHandler */.){. 
23510 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
23520 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
23530 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
23540 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23550 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
23560 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  g;..  if( isOpen
23570 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23580 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20      void **ap = 
23590 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72  (void **)&pPager
235a0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->xBusyHandler;.
235b0 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e      assert( ((in
235c0 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70  t(*)(void *))(ap
235d0 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64  [0]))==xBusyHand
235e0 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ler );.    asser
235f0 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48  t( ap[1]==pBusyH
23600 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20  andlerArg );.   
23610 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
23620 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
23630 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
23640 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
23650 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d  (void *)ap);.  }
23660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
23670 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
23680 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
23690 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
236a0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
236b0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
236c0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
236d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
236e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
236f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
23700 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
23710 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
23720 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
23730 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
23740 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
23750 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
23760 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
23770 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
23780 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
23790 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
237a0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
237b0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
237c0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
237d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
237e0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
237f0 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
23800 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
23810 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
23820 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
23830 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
23840 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
23850 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
23860 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
23870 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
23880 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
23890 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
238a0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
238b0 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
238c0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
238d0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
238e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
238f0 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
23900 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
23910 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
23920 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
23930 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
23940 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
23950 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
23960 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
23970 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
23980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
23990 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
239a0 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
239b0 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
239c0 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
239d0 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
239e0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
239f0 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
23a00 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
23a10 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
23a20 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
23a30 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
23a40 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
23a50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23a60 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
23a70 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
23a80 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
23a90 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
23aa0 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
23ab0 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
23ac0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
23ad0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
23ae0 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
23af0 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
23b00 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
23b10 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
23b20 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
23b30 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
23b40 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
23b50 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
23b60 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
23b70 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
23b80 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23b90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23ba0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
23bb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
23bc0 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
23bd0 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
23be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23bf0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
23c00 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
23c10 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
23c20 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
23c30 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
23c40 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
23c50 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
23c60 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
23c70 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
23c80 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
23c90 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
23ca0 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
23cb0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
23cc0 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
23cd0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
23ce0 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
23cf0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
23d00 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
23d10 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
23d20 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
23d30 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
23d40 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
23d50 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
23d60 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23d70 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
23d80 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
23d90 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
23da0 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
23db0 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
23dc0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
23dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
23de0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
23df0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
23e00 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
23e10 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
23e20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
23e30 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
23e40 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
23e50 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
23e60 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23e70 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
23e80 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
23e90 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
23ea0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23eb0 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
23ec0 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
23ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23ee0 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
23ef0 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
23f00 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
23f10 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
23f20 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
23f30 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23f40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23f50 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
23f60 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
23f70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f90 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
23fa0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
23fb0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
23fc0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
23fd0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
23fe0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
23ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
24010 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
24020 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24030 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
24040 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
24050 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
24060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24080 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24090 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
240a0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
240b0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
240c0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
240d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
240e0 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
240f0 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
24100 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
24110 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
24120 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  ageSize;.    }el
24130 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24140 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b  3PageFree(pNew);
24150 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24160 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
24170 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
24180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24190 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
241a0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
241b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
241c0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
241d0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
241e0 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
241f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
24200 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
24210 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
24220 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
24230 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
24240 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
24250 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24260 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
24270 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24280 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
24290 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
242a0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
242b0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
242c0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
242d0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
242e0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
242f0 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
24300 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
24310 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
24320 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
24330 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
24340 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
24350 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24360 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
24370 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
24380 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
24390 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
243a0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
243b0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
243c0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
243d0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
243e0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
243f0 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
24400 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
24410 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
24420 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
24430 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
24440 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
24450 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
24460 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
24470 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
24480 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
24490 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
244a0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
244b0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
244c0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
244d0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
244e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
244f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
24500 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
24510 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
24520 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
24530 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
24540 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
24550 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
24560 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
24570 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
24580 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
24590 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
245a0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
245b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
245c0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
245d0 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
245e0 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
245f0 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
24600 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
24610 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
24620 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
24630 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
24640 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
24650 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
24660 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
24670 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
24680 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
24690 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
246a0 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
246b0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
246c0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
246d0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
246e0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
246f0 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
24700 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
24710 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
24720 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
24730 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
24740 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
24750 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
24760 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
24770 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
24780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24790 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
247a0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
247b0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
247c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
247d0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
247e0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
247f0 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
24800 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24810 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
24820 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
24830 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
24840 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24850 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
24860 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
24870 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24880 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
24890 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
248a0 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
248b0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
248c0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
248d0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
248e0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
248f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24900 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
24910 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
24920 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
24930 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
24940 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
24950 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
24960 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
24970 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24980 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
24990 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
249a0 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
249b0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
249c0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
249d0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
249e0 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
249f0 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
24a00 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
24a10 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
24a20 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
24a30 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
24a40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
24a50 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
24a60 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
24a70 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
24a80 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
24a90 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
24aa0 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
24ab0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
24ac0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
24ad0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
24ae0 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
24af0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24b00 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
24b10 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
24b20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24b30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
24b40 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
24b50 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
24b60 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
24b70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
24b80 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
24b90 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
24ba0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
24bb0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
24bc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
24be0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
24bf0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
24c00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
24c10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24c20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
24c30 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
24c40 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
24c50 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
24c60 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
24c70 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
24c80 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
24c90 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
24ca0 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
24cb0 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
24cc0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
24cd0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
24ce0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
24cf0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24d00 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24d10 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
24d20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
24d30 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
24d40 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
24d50 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
24d60 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
24d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
24d80 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24da0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24dc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24dd0 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
24de0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
24df0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
24e00 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
24e10 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
24e20 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
24e30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24e40 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
24e50 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
24e60 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
24e70 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
24e80 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
24e90 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
24ea0 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
24eb0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
24ec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24ed0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
24ee0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24ef0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
24f00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24f10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
24f20 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
24f30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24f40 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
24f50 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
24f60 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
24f70 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
24f80 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
24f90 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24fa0 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
24fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24fc0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
24fd0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
24fe0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
24ff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25000 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
25010 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
25020 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
25030 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
25040 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
25050 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
25060 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
25070 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
25080 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
25090 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
250a0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
250b0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
250c0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
250d0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
250e0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
250f0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
25100 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
25110 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
25120 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
25130 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
25140 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
25150 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
25160 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
25170 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
25180 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
25190 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
251a0 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
251b0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
251c0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
251d0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
251e0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
251f0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
25200 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
25210 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25240 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25250 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
25260 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
25270 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
25280 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
25290 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
252a0 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f  eady held), or o
252b0 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
252c0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
252d0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
252e0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
252f0 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
25300 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
25310 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
25320 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
25330 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
25340 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
25350 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
25360 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
25370 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
25380 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25390 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
253a0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
253b0 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
253c0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
253d0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
253e0 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
253f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
25400 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
25410 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
25420 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
25430 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
25440 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
25450 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25460 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
25470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
25480 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
25490 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
254a0 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
254b0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
254c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
254d0 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
254e0 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
254f0 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
25500 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
25510 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25520 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
25530 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
25540 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
25550 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
25560 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
25570 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
25580 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
25590 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
255a0 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
255b0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
255c0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
255d0 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
255e0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
255f0 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
25600 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
25610 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
25620 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
25630 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
25640 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
25650 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
25660 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
25670 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
25680 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
25690 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
256a0 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
256b0 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
256c0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
256d0 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
256e0 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
256f0 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
25700 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
25710 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
25720 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
25730 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
25740 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
25750 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
25760 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
25770 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
25780 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
25790 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
257a0 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
257b0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
257c0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
257d0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
257e0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
257f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
25800 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
25810 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
25820 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
25830 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
25840 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
25850 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
25860 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
25870 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
25880 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
25890 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
258a0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
258b0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
258c0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
258d0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
258e0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
258f0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
25900 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
25910 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25920 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
25930 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
25940 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
25950 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
25960 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
25970 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
25980 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
25990 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
259a0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
259b0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
259c0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
259d0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
259e0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
259f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25a00 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25a10 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
25a20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
25a30 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25a40 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
25a50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
25a60 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
25a70 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
25a80 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
25a90 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
25aa0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
25ab0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
25ac0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
25ad0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
25ae0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
25af0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
25b00 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
25b10 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
25b20 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
25b30 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
25b40 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
25b50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
25b60 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
25b70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25b80 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
25b90 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25ba0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25bb0 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
25bc0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
25bd0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
25be0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
25bf0 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
25c00 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
25c10 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
25c20 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
25c30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
25c40 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
25c50 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
25c60 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
25c70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
25c80 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
25c90 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25ca0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25cb0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
25cc0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
25cd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25ce0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
25cf0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
25d00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25d10 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
25d20 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
25d30 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
25d40 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25d50 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
25d60 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
25d70 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
25d80 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
25d90 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
25da0 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
25db0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
25dc0 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
25dd0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
25de0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
25df0 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
25e00 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
25e10 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
25e20 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
25e30 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
25e40 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
25e50 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
25e60 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
25e70 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
25e80 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25e90 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25ea0 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
25eb0 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
25ec0 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
25ed0 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
25ee0 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
25ef0 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
25f00 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
25f10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
25f20 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
25f30 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
25f40 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
25f50 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
25f60 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
25f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25f80 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
25f90 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
25fa0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
25fb0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
25fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
25fd0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
25fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25ff0 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
26000 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
26010 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
26020 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
26030 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
26040 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
26050 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
26060 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
26070 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
26080 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
26090 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
260a0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
260b0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
260c0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
260d0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
260e0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
260f0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
26100 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
26110 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
26120 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
26130 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
26140 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
26150 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
26160 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
26170 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
26180 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
26190 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
261a0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
261b0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
261c0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
261d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
261e0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
261f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26200 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26210 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
26220 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26230 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26240 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26250 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
26260 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
26270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26290 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
262a0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
262b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
262c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
262d0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
262e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
262f0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
26300 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
26310 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
26320 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
26330 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
26340 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
26350 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
26360 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
26370 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
26380 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
26390 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
263a0 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
263b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
263c0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
263d0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
263e0 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
263f0 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
26400 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
26410 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
26420 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
26430 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
26440 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
26450 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
26460 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26470 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26480 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
26490 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
264a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
264b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
264c0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
264d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
264f0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
26500 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26520 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
26530 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
26540 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
26550 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
26560 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26570 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
26580 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
26590 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265b0 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
265c0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
265d0 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d    .  if( pPager-
265e0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29  >pMmapFreelist )
265f0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26600 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  p = pPager->pMma
26610 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  pFreelist;.    p
26620 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26630 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  list = p->pDirty
26640 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
26650 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
26660 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50  p->pExtra, 0, pP
26670 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
26680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
26690 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
266a0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
266b0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
266c0 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
266d0 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
266e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
266f0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26700 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26710 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
26720 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
26730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26740 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26750 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
26760 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
26770 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
26780 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
26790 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
267a0 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
267b0 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
267c0 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
267d0 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
267e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
267f0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
26800 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
26810 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
26820 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
26830 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
26840 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
26850 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
26860 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
26870 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
26880 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
26890 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
268a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
268b0 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
268c0 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ce to page pPg. 
268d0 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  pPg must have be
268e0 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  en returned by a
268f0 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61  n .** earlier ca
26900 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69  ll to pagerAcqui
26910 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  reMapPage()..*/.
26920 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
26930 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
26940 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
26950 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
26960 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50  Pg->pPager;.  pP
26970 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d  ager->nMmapOut--
26980 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
26990 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
269a0 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65  reelist;.  pPage
269b0 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
269c0 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72   = pPg;..  asser
269d0 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
269e0 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
269f0 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65  n>=3 );.  sqlite
26a00 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26a10 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67  r->fd, (i64)(pPg
26a20 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  ->pgno-1)*pPager
26a30 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d  ->pageSize, pPg-
26a40 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pData);.}../*.*
26a50 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72  * Free all PgHdr
26a60 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20   objects stored 
26a70 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d  in the Pager.pMm
26a80 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e  apFreelist list.
26a90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26aa0 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26ab0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26ac0 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50  .  PgHdr *p;.  P
26ad0 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66  gHdr *pNext;.  f
26ae0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d  or(p=pPager->pMm
26af0 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70  apFreelist; p; p
26b00 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
26b10 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  xt = p->pDirty;.
26b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26b30 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (p);.  }.}.../*.
26b40 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
26b50 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
26b60 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
26b70 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
26b80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
26b90 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
26ba0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
26bb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
26bc0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
26bd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
26be0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
26bf0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
26c00 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
26c10 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
26c20 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
26c30 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
26c40 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
26c50 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
26c60 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
26c70 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26c80 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
26c90 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
26ca0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
26cb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26cc0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
26cd0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
26ce0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
26cf0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
26d00 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
26d10 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
26d20 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
26d30 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
26d40 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
26d50 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
26d60 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
26d70 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
26d80 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
26d90 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
26da0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
26db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26dc0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
26dd0 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
26de0 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
26df0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
26e00 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
26e10 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
26e20 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
26e30 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
26e40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26e50 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26e60 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70  (pPager);.  /* p
26e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
26e80 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
26e90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
26ea0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
26eb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
26ec0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
26ed0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
26ee0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
26ef0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
26f00 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50  ize, pTmp);.  pP
26f10 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
26f20 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
26f30 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
26f40 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
26f50 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
26f60 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
26f70 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
26f80 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
26f90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
26fa0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
26fb0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
26fc0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
26fd0 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
26fe0 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
26ff0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
27000 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
27010 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
27020 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
27030 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
27040 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
27050 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
27060 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
27070 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
27080 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
27090 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
270a0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
270b0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
270c0 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
270d0 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
270e0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
270f0 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
27100 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
27110 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
27120 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
27130 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27140 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
27150 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
27160 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
27170 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
27180 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
27190 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
271a0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
271b0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
271c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
271d0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
271e0 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
271f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27200 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
27210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27220 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
27230 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27240 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
27250 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
27260 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
27270 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
27280 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
27290 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
272a0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
272b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
272c0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
272d0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
272e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
272f0 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
27300 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
27310 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
27320 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27330 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
27340 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27350 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
27360 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
27370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
27380 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
27390 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
273a0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
273b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
273c0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
273d0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
273e0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
273f0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27400 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
27410 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
27420 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
27430 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27440 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27450 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27460 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
27470 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
27480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27490 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
274a0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
274b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
274c0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
274d0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
274e0 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
274f0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
27500 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
27510 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27520 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
27530 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27540 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27550 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27560 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
27570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
27580 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
27590 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
275a0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
275b0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
275c0 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
275d0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
275e0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
275f0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
27600 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
27610 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
27620 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
27630 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
27640 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
27650 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
27660 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
27670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
27680 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
27690 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
276a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
276b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
276c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
276d0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
276e0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
276f0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
27700 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
27710 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
27720 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
27730 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
27740 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
27750 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
27760 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
27770 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
27780 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
27790 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
277a0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
277b0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
277c0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
277d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
277e0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
277f0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
27800 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
27810 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
27820 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
27830 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
27840 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
27850 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
27860 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
27870 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
27880 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
27890 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
278a0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
278b0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
278c0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
278d0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
278e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
278f0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
27900 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
27910 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
27920 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
27930 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
27940 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
27950 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
27960 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
27970 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
27980 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
27990 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
279a0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
279b0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
279c0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
279d0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
279e0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
279f0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
27a00 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
27a10 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
27a20 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
27a30 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
27a40 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
27a50 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
27a60 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27a70 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
27a80 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
27a90 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
27aa0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
27ab0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
27ac0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
27ad0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
27ae0 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
27af0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
27b00 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
27b10 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
27b20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
27b30 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27b40 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
27b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27b60 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
27b70 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
27b80 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
27b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27bb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
27bc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
27bd0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27be0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
27bf0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
27c00 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27c10 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
27c20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
27c30 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
27c40 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
27c50 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
27c60 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
27c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
27c80 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
27c90 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
27ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
27cb0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
27cc0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
27cd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
27ce0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27cf0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
27d00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27d10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27d20 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
27d30 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
27d40 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
27d50 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
27d60 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
27d70 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
27d80 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
27d90 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
27da0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
27db0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
27dc0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
27dd0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
27de0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
27df0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
27e00 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
27e10 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
27e20 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
27e30 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
27e40 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
27e50 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
27e60 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
27e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
27e80 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
27e90 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
27ea0 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
27eb0 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
27ec0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
27ed0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
27ee0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
27ef0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
27f00 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
27f10 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
27f20 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
27f30 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
27f40 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
27f50 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
27f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
27f70 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
27f80 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
27f90 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
27fa0 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
27fb0 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
27fc0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
27fd0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
27fe0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
27ff0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
28000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28010 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
28020 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
28030 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
28040 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
28050 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
28060 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
28070 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
28080 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
28090 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
280a0 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
280b0 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
280c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
280d0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
280e0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
280f0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
28100 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
28110 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
28120 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
28130 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
28140 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
28150 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28160 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
28170 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
28180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
28190 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
281a0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
281b0 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
281c0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
281d0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
281e0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
281f0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
28200 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
28210 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
28220 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
28230 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
28240 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
28250 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
28260 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
28270 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
28280 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
28290 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
282a0 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
282b0 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
282c0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
282d0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
282e0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
282f0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
28300 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
28310 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
28320 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
28330 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
28340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28350 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
28360 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
28370 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
28380 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
28390 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
283a0 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
283b0 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
283c0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
283d0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
283e0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
283f0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
28400 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28410 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
28420 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
28430 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
28440 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
28450 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
28460 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28470 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
28480 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
28490 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
284a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
284b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
284c0 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
284d0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
284e0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
284f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
28500 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
28510 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28520 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
28530 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
28540 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
28550 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28560 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
28580 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
28590 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
285a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
285b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
285c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
285d0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
285e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
285f0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
28600 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
28610 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
28620 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
28630 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
28640 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
28650 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
28660 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
28670 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
28680 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
28690 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
286a0 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
286b0 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
286c0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
286d0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
286e0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
286f0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
28700 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
28710 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
28720 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
28730 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
28740 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
28750 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
28760 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
28770 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
28780 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
28790 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
287a0 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
287b0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
287c0 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
287d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
287e0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
287f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
28800 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
28810 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
28820 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28830 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
28840 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
28850 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28860 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28870 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28880 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
28890 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
288a0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
288b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
288c0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
288d0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
288e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
288f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28900 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
28910 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
28950 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
28960 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
28970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28980 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
28990 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
289a0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
289b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
289c0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
289d0 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
289e0 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
289f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28a20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
28a30 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28a40 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28a50 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
28a60 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
28a70 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
28a80 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
28a90 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28aa0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
28ab0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
28ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
28ad0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
28ae0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
28af0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
28b00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28b10 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
28b20 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
28b30 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
28b40 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
28b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28b60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28b70 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
28b80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
28b90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28ba0 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
28bb0 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
28bc0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
28bd0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
28be0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
28bf0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
28c00 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
28c10 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
28c20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28c30 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28c40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
28c60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28c70 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
28c80 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
28c90 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
28ca0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
28cb0 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
28cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
28cd0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
28ce0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
28cf0 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
28d00 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
28d10 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
28d20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
28d30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
28d40 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
28d50 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
28d60 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
28d70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
28d80 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
28d90 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28da0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28dd0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
28de0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
28df0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
28e00 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
28e10 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
28e20 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
28e30 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
28e40 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
28e50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
28e60 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
28e70 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
28e80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
28e90 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
28ea0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
28eb0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
28ec0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
28ed0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
28ee0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
28ef0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
28f00 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
28f10 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
28f20 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
28f30 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
28f40 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
28f50 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
28f60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f70 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
28f80 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
28f90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
28fa0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
28fb0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
28fc0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
28fd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
28fe0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
28ff0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29000 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
29010 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29020 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
29030 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
29040 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
29050 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
29060 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
29070 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
29080 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
29090 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
290a0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
290b0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
290c0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
290d0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
290e0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
290f0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
29100 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
29110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29120 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
29130 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
29140 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
29150 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
29160 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
29170 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
29180 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
29190 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
291a0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
291b0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
291c0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
291d0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
291e0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
291f0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
29200 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
29210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29220 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
29230 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
29240 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
29250 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
29260 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
29270 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
29280 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
29290 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
292a0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
292b0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
292c0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
292d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
292e0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
292f0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
29300 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
29310 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
29320 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
29330 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
29340 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29350 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
29360 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
29370 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
29380 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
29390 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
293a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
293b0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
293c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
293d0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
293e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
293f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
29400 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29410 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
29420 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
29430 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
29440 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
29450 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
29460 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
29470 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
29480 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29490 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
294a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
294b0 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
294c0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
294d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
294e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
294f0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
29500 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
29510 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
29520 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
29530 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
29540 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
29550 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29560 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
29570 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
29580 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
29590 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
295a0 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
295b0 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
295c0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
295d0 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
295e0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
295f0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
29600 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
29610 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
29620 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
29630 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
29640 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
29650 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
29660 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
29670 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
29680 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
29690 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
296a0 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
296b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
296c0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
296d0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
296e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
296f0 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
29700 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65  dbHintSize<pPage
29710 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20  r->dbSize.   && 
29720 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c  (pList->pDirty |
29730 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50  | pList->pgno>pP
29740 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29750 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
29760 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
29770 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
29780 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
29790 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
297a0 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
297b0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
297c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
297d0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
297e0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
297f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
29800 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
29810 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
29820 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29830 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
29840 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
29850 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
29860 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
29870 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
29880 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
29890 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
298a0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
298b0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
298c0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
298d0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
298e0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
298f0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
29900 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
29910 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
29920 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
29930 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
29940 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
29950 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
29960 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
29970 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
29980 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
29990 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
299a0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
299b0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
299c0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
299d0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
299e0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
299f0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
29a00 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
29a10 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
29a20 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
29a30 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
29a40 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
29a50 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
29a60 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
29a70 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
29a80 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
29ac0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
29ad0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
29ae0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29af0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
29b00 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
29b10 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
29b20 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
29b30 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
29b40 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
29b50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
29b60 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
29b70 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
29b80 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
29b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
29ba0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
29bb0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
29bc0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
29bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29be0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
29bf0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
29c00 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
29c10 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
29c20 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
29c30 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
29c40 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
29c50 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
29c60 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
29c70 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
29c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29c90 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
29ca0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
29cb0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
29cc0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29cd0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
29ce0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
29cf0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
29d00 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
29d10 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
29d20 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
29d30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
29d40 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
29d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29d60 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
29d70 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
29d80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
29d90 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
29da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
29db0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
29dc0 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
29dd0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
29de0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
29df0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
29e00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
29e10 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
29e20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
29e30 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
29e40 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
29e50 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
29e60 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
29e70 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
29e80 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
29e90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29ea0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
29eb0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
29ec0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
29ed0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
29ee0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
29ef0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29f00 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
29f10 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
29f20 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
29f30 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
29f40 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
29f50 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
29f60 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
29f70 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
29f80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
29f90 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
29fa0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
29fb0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
29fc0 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
29fd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
29fe0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
29ff0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2a000 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
2a010 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
2a020 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
2a030 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2a040 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2a050 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
2a060 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
2a070 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
2a080 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
2a090 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
2a0a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2a0b0 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
2a0c0 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
2a0d0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2a0e0 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
2a0f0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2a100 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2a110 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2a120 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2a130 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
2a140 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a150 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2a160 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
2a170 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
2a180 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2a190 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2a1a0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
2a1b0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
2a1c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2a1d0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
2a1e0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
2a1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
2a200 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
2a210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a220 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2a230 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2a240 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2a250 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2a260 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2a270 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a280 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2a290 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2a2a0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2a2b0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2a2c0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2a2d0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2a2e0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2a2f0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a300 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2a310 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a320 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2a330 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2a340 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2a350 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a360 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a370 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a380 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a390 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a3a0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a3b0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a3c0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a3d0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a3e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a3f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a400 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a410 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a420 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a430 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a440 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a450 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a460 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a470 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a480 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a490 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2a4a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2a4b0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2a4c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a4d0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2a4e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a4f0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a510 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a520 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a530 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a540 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a550 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a560 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2a570 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2a580 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2a590 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a5a0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2a5b0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2a5c0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2a5d0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2a5e0 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2a5f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2a600 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2a610 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2a620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2a630 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2a640 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2a650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a660 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2a670 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a680 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a690 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2a6a0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2a6b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a6c0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2a6d0 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2a6e0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2a6f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2a700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a710 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2a720 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a730 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2a740 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a750 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a760 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a770 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2a780 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2a790 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2a7a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a7c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a7d0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a7e0 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2a7f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a800 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2a810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a830 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2a840 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2a850 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a860 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2a870 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2a880 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a890 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2a8a0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2a8b0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
2a8c0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2a8d0 49 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72  IfRequired(PgHdr
2a8e0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75   *pPg){.  if( su
2a8f0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2a900 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Pg) ){.    retur
2a910 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  n subjournalPage
2a920 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
2a930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a940 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
2a950 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2a960 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2a970 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
2a980 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
2a990 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
2a9a0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
2a9b0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2a9c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2a9d0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
2a9e0 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
2a9f0 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
2aa00 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
2aa10 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
2aa20 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
2aa30 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
2aa40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
2aa50 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
2aa60 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
2aa70 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
2aa80 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
2aa90 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2aaa0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
2aab0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
2aac0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
2aad0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
2aae0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
2aaf0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2ab00 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
2ab10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
2ab20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
2ab30 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
2ab40 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
2ab50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ab60 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
2ab70 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
2ab80 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
2ab90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
2aba0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2abb0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
2abc0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2abd0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
2abe0 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
2abf0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2ac00 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2ac10 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2ac20 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
2ac30 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
2ac40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2ac50 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
2ac60 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
2ac70 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
2ac80 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
2ac90 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
2aca0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2acb0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2acc0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2acd0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2ace0 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
2acf0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2ad00 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
2ad10 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
2ad20 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2ad30 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
2ad40 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
2ad50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2ad60 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
2ad70 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
2ad80 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
2ad90 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
2ada0 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    /* The doNotSp
2adb0 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69  ill NOSYNC bit i
2adc0 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
2add0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
2ade0 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
2adf0 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
2ae00 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
2ae10 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
2ae20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
2ae30 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
2ae40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ae50 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
2ae60 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
2ae70 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
2ae80 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
2ae90 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
2aea0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
2aeb0 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b  otSpill ROLLBACK
2aec0 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e   and OFF bits in
2aed0 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
2aee0 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72   spilling.  ** r
2aef0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2af00 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79  ther or not a sy
2af10 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
2af20 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
2af30 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  ing.  ** a rollb
2af40 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72  ack or by user r
2af50 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69  equest, respecti
2af60 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  vely..  **.  ** 
2af70 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
2af80 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
2af90 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2afa0 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
2afb0 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
2afc0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
2afd0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
2afe0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
2aff0 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  ation it .  ** i
2b000 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2b010 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2b020 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2b030 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2b040 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==3.  ** while
2b050 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b060 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2b070 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2b080 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2b090 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2b0a0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b0b0 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2b0c0 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2b0d0 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2b0e0 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2b0f0 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2b100 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2b110 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2b120 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2b130 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2b140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b150 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b160 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b170 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
2b180 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63  LBACK );.  testc
2b190 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b1a0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b1b0 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73  LAG_OFF );.  tes
2b1c0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b1d0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b1e0 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a  LFLAG_NOSYNC );.
2b1f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2b200 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28  NotSpill.   && (
2b210 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
2b220 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47  ill & (SPILLFLAG
2b230 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46  _ROLLBACK|SPILLF
2b240 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20  LAG_OFF))!=0.   
2b250 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
2b260 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2b270 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20  YNC)!=0).  ){.  
2b280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b290 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
2b2a0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2b2b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2b2c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2b2d0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
2b2e0 6f 6e 20 69 73 20 61 20 22 42 45 47 49 4e 20 55  on is a "BEGIN U
2b2f0 4e 4c 4f 43 4b 45 44 22 20 74 72 61 6e 73 61 63  NLOCKED" transac
2b300 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 20 0a  tion, the page .
2b310 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
2b320 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
2b330 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69  . Return early i
2b340 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
2b350 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b360 70 41 6c 6c 52 65 61 64 20 29 20 72 65 74 75 72  pAllRead ) retur
2b370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
2b380 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
2b390 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
2b3a0 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
2b3b0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
2b3c0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b3d0 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a  Required(pPg); .
2b3e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b3f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b400 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
2b410 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
2b420 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2b430 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
2b440 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2b450 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
2b460 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
2b470 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b480 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
2b490 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2b4a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
2b4b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
2b4c0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
2b4d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
2b4e0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2b4f0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2b500 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2b510 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2b520 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2b530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2b550 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2b560 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b570 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2b580 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2b590 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2b5a0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2b5b0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2b5c0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2b5d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b5e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2b5f0 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2b600 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b610 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b620 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2b630 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b640 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2b650 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2b660 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2b670 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc); .}.../*.** 
2b680 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2b690 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2b6a0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2b6b0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2b6c0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2b6d0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2b6e0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2b6f0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2b700 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2b710 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2b720 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2b730 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2b740 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2b750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2b760 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2b770 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2b780 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2b790 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2b7a0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2b7b0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2b7c0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2b7d0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2b7e0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2b7f0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2b800 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2b810 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2b820 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2b830 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2b840 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2b850 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2b860 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2b870 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2b880 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2b890 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2b8a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2b8b0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2b8c0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2b8d0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2b8e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2b8f0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2b900 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2b910 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2b920 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2b930 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2b940 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2b950 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2b960 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2b970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
2b980 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2b990 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2b9a0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2b9b0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2b9c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2b9d0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2b9e0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2b9f0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2ba00 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2ba10 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2ba20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2ba30 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2ba40 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2ba50 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2ba60 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2ba70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2ba80 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2ba90 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2baa0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2bab0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2bac0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2bad0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2bae0 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2baf0 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2bb00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2bb10 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2bb20 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2bb30 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2bb40 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2bb50 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2bb60 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2bb70 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2bb80 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2bb90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2bba0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2bbb0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2bbc0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2bbd0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2bbe0 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2bbf0 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2bc00 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2bc10 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2bc20 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2bc30 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2bc40 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2bc50 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2bc60 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2bc70 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2bc80 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2bc90 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2bca0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2bcb0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2bcc0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2bcd0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2bce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bcf0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2bd00 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2bd20 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2bd30 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2bd40 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2bd50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2bd60 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2bd70 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2bd80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2bd90 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2bda0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2bdb0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2bdc0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2bdd0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2bde0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2bdf0 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2be00 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2be10 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2be20 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2be30 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2be40 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2be50 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2be60 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2be70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2be80 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2be90 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2bea0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2beb0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2bec0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2bed0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2bee0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2bef0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2bf00 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2bf10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2bf20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2bf30 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2bf40 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2bf50 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2bf60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2bf70 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2bf80 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2bf90 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2bfa0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2bfb0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2bfc0 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2bfd0 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2bfe0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2bff0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2c000 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c010 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2c020 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2c030 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2c040 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2c050 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2c060 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2c070 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2c080 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2c090 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2c0a0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c0b0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2c0c0 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2c0d0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2c0e0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2c0f0 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2c100 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2c110 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2c120 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2c130 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2c140 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2c150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c160 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2c170 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2c180 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2c190 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2c1a0 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2c1b0 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2c1c0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2c1d0 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2c1e0 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2c1f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2c200 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2c210 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  ). This.  ** is 
2c220 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
2c230 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
2c240 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
2c250 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2c260 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75  .  ** and a regu
2c270 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2c280 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68  -handle. Note th
2c290 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f  at a "regular jo
2c2a0 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20  urnal-handle".  
2c2b0 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70  ** may be a wrap
2c2c0 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63  per capable of c
2c2d0 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74  aching the first
2c2e0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
2c2f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
2c300 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69  e in memory to i
2c310 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f  mplement the ato
2c320 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2c330 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a  zation (see .  *
2c340 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f  * source file jo
2c350 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20  urnal.c)..  */. 
2c360 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
2c370 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71  nalSize(pVfs)>sq
2c380 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c390 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75  ize() ){.    jou
2c3a0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c3b0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2c3c0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2c3d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f  .  }else{.    jo
2c3e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2c3f0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65  ROUND8(sqlite3Me
2c400 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b  mJournalSize());
2c410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2c420 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2c430 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2c440 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2c450 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2c460 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2c470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2c480 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2c490 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2c4a0 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2c4b0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2c4c0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2c4d0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2c4e0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c4f0 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2c500 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2c510 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2c520 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c530 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61  NOMEM;.      nPa
2c540 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c550 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2c560 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  me);.      zFile
2c570 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
2c580 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2c590 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2c5a0 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2c5b0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2c5c0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2c5d0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2c5e0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2c5f0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2c600 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2c610 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2c620 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2c630 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2c640 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2c650 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2c660 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2c670 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2c680 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2c690 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2c6a0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2c6b0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2c6c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2c6d0 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29  (0, nPathname*2)
2c6e0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2c6f0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2c700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c710 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2c720 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2c730 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2c740 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2c750 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2c760 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2c770 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2c780 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2c790 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2c7a0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2c7b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2c7c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c7d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c7e0 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2c7f0 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2c800 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2c810 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2c820 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2c830 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2c840 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2c850 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2c860 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2c870 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2c880 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2c890 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2c8a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2c8b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2c8c0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2c8d0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2c8e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2c8f0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2c900 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2c910 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2c920 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2c930 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2c940 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2c950 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2c960 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2c970 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2c980 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2c990 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2c9a0 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2c9b0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2c9c0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2c9d0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2c9e0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2c9f0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2ca00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2ca10 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2ca20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2ca30 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2ca40 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2ca50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ca60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ca70 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2ca80 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2ca90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2caa0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2cab0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2cac0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2cad0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2cae0 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2caf0 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2cb00 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2cb10 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2cb20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2cb30 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2cb40 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2cb50 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2cb60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2cb70 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2cb90 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2cba0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2cbb0 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2cbd0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2cbe0 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2cbf0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2cc00 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2cc10 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2cc20 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2cc30 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2cc40 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2cc50 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2cc60 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2cc70 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2cc80 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2cc90 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2cca0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2ccb0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2ccc0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2ccd0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2cce0 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2ccf0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2cd00 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2cd10 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2cd20 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2cd30 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2cd40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2cd50 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2cd60 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2cd70 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2cd80 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2cd90 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2cda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2cdb0 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2cdc0 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2cdd0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2cde0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2cdf0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2ce00 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2ce10 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2ce20 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2ce30 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2ce40 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2ce50 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2ce60 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2ce70 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2ce80 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2ce90 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2cea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ceb0 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2cec0 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2ced0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2cee0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2cef0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2cf00 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2cf10 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2cf20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2cf30 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2cf40 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2cf50 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2cf60 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2cf70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2cf80 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2cf90 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2cfa0 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2cfb0 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2cfc0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2cfd0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2cfe0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2cff0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2d000 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d010 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2d020 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2d030 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2d040 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d050 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2d060 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2d070 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2d080 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d090 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d0a0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2d0b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2d0c0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d0d0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d0e0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2d0f0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d100 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2d110 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2d120 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2d130 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2d140 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2d150 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2d160 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2d170 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d180 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2d190 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2d1a0 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2d1b0 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2d1c0 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2d1d0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d1e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2d1f0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d200 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2d210 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2d220 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2d230 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2d240 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d250 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2d260 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2d270 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d280 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d290 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d2a0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2d2b0 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2d2c0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d2d0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d2e0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2d2f0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2d300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d310 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2d320 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2d330 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2d340 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2d350 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2d360 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d370 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d380 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2d390 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2d3a0 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2d3b0 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2d3c0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2d3d0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2d3e0 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2d3f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d400 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2d410 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2d420 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2d430 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2d440 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2d450 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2d460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d470 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d480 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2d490 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d4b0 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2d4c0 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2d4d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d4e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2d4f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d500 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2d510 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2d520 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2d530 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2d540 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2d550 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2d560 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2d570 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2d580 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2d590 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2d5a0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2d5b0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2d5c0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2d5d0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2d5e0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2d5f0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2d600 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d610 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2d620 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2d630 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2d640 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d650 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2d660 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2d670 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2d680 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2d690 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2d6a0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2d6b0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2d6c0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2d6d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2d6e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d6f0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2d700 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2d710 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2d720 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2d730 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2d740 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2d750 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2d760 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2d770 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2d780 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2d790 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d7a0 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2d7b0 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2d7c0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2d7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d7e0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2d7f0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2d800 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d820 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2d830 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d840 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2d850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d860 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2d870 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2d880 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2d890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d8a0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2d8b0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2d8c0 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2d8d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2d8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2d8f0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2d900 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2d910 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2d920 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2d930 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2d940 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2d950 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2d960 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d970 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2d980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2d990 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2d9a0 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2d9b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d9c0 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2d9d0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
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 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2da10 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2da20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2da30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2da50 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2da60 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2da70 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2da80 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2da90 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2daa0 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2dab0 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2dac0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2dad0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2dae0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2daf0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2db00 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2db10 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2db20 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2db30 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2db40 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2db50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2db60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2db70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2db80 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2db90 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2dba0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2dbb0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2dbc0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2dbd0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dbe0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2dbf0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2dc00 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2dc10 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2dc20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2dc30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2dc40 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2dc50 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2dc60 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2dc70 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2dc80 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2dc90 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2dca0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2dcb0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2dcc0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2dcd0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2dce0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2dcf0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2dd00 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2dd10 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2dd20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2dd30 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2dd40 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2dd50 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2dd60 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2dd70 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2dd80 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2dd90 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2dda0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2ddb0 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2ddc0 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2ddd0 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2dde0 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2ddf0 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2de00 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2de10 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2de20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2de30 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2de40 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2de50 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2de60 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2de70 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2de80 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2de90 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2dea0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2deb0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2dec0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2ded0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2dee0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2def0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2df00 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2df10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2df20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2df30 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2df40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2df50 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2df60 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2df70 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2df80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2df90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2dfa0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2dfb0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2dfc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dfd0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2dfe0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2dff0 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55      nExtra = ROU
2e000 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20  ND8(nExtra);.   
2e010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2e020 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2e030 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2e040 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2e050 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2e060 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2e070 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2e080 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e090 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e0a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e0b0 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2e0c0 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2e0d0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e0e0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2e110 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2e120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2e130 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2e140 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2e150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2e160 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2e170 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2e180 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e190 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e1a0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e1b0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e1c0 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e1d0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e1e0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e1f0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e200 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e210 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e220 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e230 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e240 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e250 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e260 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e270 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e290 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e2a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e2b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e2c0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e2d0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e2e0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e2f0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e300 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e310 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e320 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e330 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2e340 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2e350 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2e360 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2e370 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e380 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2e390 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2e3a0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e3b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e3c0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2e3d0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2e3e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2e3f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2e400 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2e410 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2e420 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2e430 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2e440 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2e450 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2e460 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2e470 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2e480 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2e490 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2e4a0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2e4b0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2e4c0 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2e4d0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
2e4e0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2e4f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e500 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e510 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e520 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  t( pPager->syncF
2e530 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2e540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77  ssert( pPager->w
2e550 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  alSyncFlags==0 )
2e560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e570 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2e580 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ags==0 );.  }els
2e590 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  e{.    pPager->f
2e5a0 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  ullSync = 1;.   
2e5b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e5c0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e5d0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
2e5e0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2e5f0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e600 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e  NORMAL | WAL_SYN
2e610 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
2e620 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
2e630 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2e640 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e650 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2e660 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
2e670 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e680 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
2e690 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2e6a0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
2e6b0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
2e6c0 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
2e6d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2e6e0 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
2e6f0 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
2e700 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
2e710 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2e720 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
2e730 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
2e740 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2e750 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
2e760 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
2e770 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2e780 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2e790 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
2e7a0 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
2e7b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e7c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2e7d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
2e7e0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2e7f0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
2e800 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e810 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
2e820 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
2e830 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
2e840 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20  = xReinit;.  /* 
2e850 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2e860 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2e870 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2e880 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e890 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
2e8a0 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
2e8b0 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
2e8c0 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
2e8d0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2e8e0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2e8f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2e900 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
2e910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2e920 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
2e930 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
2e940 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
2e950 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
2e960 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2e970 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
2e980 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
2e990 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
2e9a0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
2e9b0 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
2e9c0 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
2e9d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
2e9e0 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
2e9f0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2ea00 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
2ea10 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
2ea20 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2ea30 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
2ea40 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
2ea50 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
2ea60 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
2ea70 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
2ea80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
2ea90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eaa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2eab0 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
2eac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2ead0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
2eae0 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
2eaf0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
2eb00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2eb10 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
2eb20 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2eb30 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
2eb40 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
2eb50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2eb60 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
2eb70 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
2eb80 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
2eb90 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
2eba0 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
2ebb0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
2ebc0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
2ebd0 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
2ebe0 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
2ebf0 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
2ec00 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
2ec10 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
2ec20 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
2ec30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
2ec40 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2ec50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ec60 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
2ec70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2ec80 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2ec90 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
2eca0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
2ecb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2ecc0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2ecd0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2ece0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2ecf0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2ed00 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2ed10 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2ed20 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2ed30 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2ed40 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2ed50 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2ed60 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2ed70 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2ed80 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2ed90 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2eda0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2edb0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2edc0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2edd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2ede0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2edf0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2ee00 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2ee10 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2ee20 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2ee30 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2ee40 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2ee50 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2ee60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ee70 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2ee80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ee90 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2eea0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2eeb0 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2eec0 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2eed0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2eee0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2eef0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2ef00 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2ef10 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2ef20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2ef30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2ef40 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2ef50 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2ef60 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2ef70 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2ef80 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2ef90 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2efa0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2efb0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2efc0 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2efd0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2efe0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2eff0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2f000 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2f010 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f020 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2f030 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2f040 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2f050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2f060 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2f070 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2f080 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2f090 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2f0a0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2f0b0 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2f0c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f0d0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f0e0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2f0f0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2f100 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2f110 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2f120 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2f130 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2f140 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2f150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f160 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f170 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2f180 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2f190 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2f1a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f1b0 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2f1c0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2f1d0 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2f1e0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f1f0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2f200 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f210 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2f220 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2f230 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2f240 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2f250 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f260 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2f270 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2f280 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2f290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f2a0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2f2b0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2f2c0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2f2d0 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2f2e0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2f2f0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2f300 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2f310 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2f320 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2f330 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2f340 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2f350 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f360 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f370 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f380 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2f390 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2f3a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2f3b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f3c0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2f3d0 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2f3e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f3f0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2f400 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2f410 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2f420 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2f430 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f440 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2f450 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2f460 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2f470 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2f480 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2f490 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2f4a0 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2f4b0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2f4c0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2f4d0 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2f4e0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2f4f0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2f500 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f510 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f520 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2f530 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2f540 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2f550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f560 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2f570 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2f580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f590 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2f5a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2f5b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2f5c0 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2f5d0 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2f5e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2f5f0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2f600 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2f610 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2f620 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2f630 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2f640 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f650 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2f660 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2f670 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2f680 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2f690 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2f6a0 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2f6b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2f6c0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2f6d0 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2f6e0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2f6f0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2f700 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2f710 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2f720 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2f730 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2f740 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2f750 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2f760 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2f770 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2f780 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2f790 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2f7a0 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2f7b0 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2f7c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f7d0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2f7e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2f7f0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2f800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f810 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2f820 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f840 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2f850 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2f860 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  le */..      rc 
2f870 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2f880 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2f890 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2f8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f8b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2f8c0 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
2f8d0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
2f8e0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
2f8f0 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
2f900 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2f910 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
2f920 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
2f930 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2f940 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
2f950 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2f960 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
2f970 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
2f980 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
2f990 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
2f9a0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2f9b0 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
2f9c0 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
2f9d0 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
2f9e0 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
2f9f0 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
2fa00 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
2fa10 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
2fa20 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
2fa30 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
2fa40 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
2fa50 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2fa60 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
2fa70 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
2fa80 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2fa90 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
2faa0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fab0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2fac0 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
2fad0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fae0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2faf0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2fb00 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2fb10 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2fb20 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2fb30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fb40 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2fb50 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2fb60 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2fb70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2fb80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2fb90 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
2fba0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2fbb0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2fbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fbd0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2fbe0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2fbf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fc00 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
2fc10 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2fc20 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
2fc30 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
2fc40 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
2fc50 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
2fc60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2fc70 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
2fc80 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
2fc90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
2fca0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
2fcb0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
2fcc0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2fcd0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2fce0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
2fcf0 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
2fd00 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
2fd10 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
2fd20 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
2fd30 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
2fd40 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
2fd50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2fd60 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2fd70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2fd80 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2fd90 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
2fda0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2fdb0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
2fdc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2fdd0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2fde0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2fdf0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
2fe00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fe20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fe30 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
2fe40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2fe50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
2fe60 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
2fe70 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
2fe80 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
2fe90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fea0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
2feb0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
2fec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fed0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
2fee0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2fef0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ff10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2ff20 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2ff30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ff40 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
2ff50 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
2ff60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
2ff70 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
2ff80 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
2ff90 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
2ffa0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
2ffb0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
2ffc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
2ffd0 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
2ffe0 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
2fff0 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
30000 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
30010 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
30020 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
30030 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30040 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
30050 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
30060 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
30070 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
30080 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
30090 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
300a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
300b0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
300c0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
300d0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
300e0 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
300f0 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
30100 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
30110 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
30120 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
30130 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
30140 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
30150 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
30160 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
30170 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
30180 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
30190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
301a0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
301b0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
301c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
301d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
301e0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
301f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30200 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30210 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
30230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30240 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
30250 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
30260 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
30270 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30280 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
30290 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
302a0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
302b0 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
302c0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
302d0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
302e0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
302f0 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
30300 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
30310 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
30320 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30330 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
30340 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
30350 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
30360 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
30370 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
30380 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
30390 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
303a0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
303b0 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
303c0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
303d0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
303e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
303f0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
30400 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
30410 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
30420 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
30430 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
30440 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
30450 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
30460 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
30470 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
30480 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
30490 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
304a0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
304b0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
304c0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
304d0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
304e0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
304f0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
30500 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
30510 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
30520 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
30530 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
30540 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
30550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30560 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
30570 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
30580 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
30590 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
305a0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
305b0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
305c0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
305d0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
305e0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
305f0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
30600 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30610 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
30620 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
30630 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
30640 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
30650 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
30660 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
30670 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
30680 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
30690 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
306a0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
306b0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
306c0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
306d0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
306e0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
306f0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
30700 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30710 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30720 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
30730 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
30740 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
30750 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30760 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
30770 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
30780 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
30790 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
307a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
307b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
307c0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
307d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
307e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30800 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30810 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
30820 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
30830 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
30840 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
30850 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
30860 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
30870 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
30880 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
30890 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
308a0 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
308b0 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
308c0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
308d0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
308e0 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
308f0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30900 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
30910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
30920 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
30930 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
30940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
30950 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
30960 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
30970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30980 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30990 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
309a0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
309b0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
309c0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
309d0 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
309e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
309f0 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
30a00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30a10 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
30a20 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
30a40 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
30a50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30a60 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
30a70 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
30a80 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
30a90 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20   !MEMDB );..    
30aa0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
30ab0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
30ac0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
30af0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
30b00 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
30b10 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
30b20 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
30b30 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
30b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30b50 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
30b60 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
30b70 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
30b80 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
30b90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30ba0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
30bb0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
30bc0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
30bd0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
30be0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
30bf0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
30c00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
30c10 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
30c20 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
30c30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
30c40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30c50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
30c60 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
30c70 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
30c80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
30c90 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
30ca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30cb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
30cc0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
30cd0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30ce0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
30cf0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
30d00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30d10 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
30d20 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
30d30 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
30d40 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
30d50 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
30d60 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
30d70 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
30d80 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
30d90 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
30da0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30db0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
30dc0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
30dd0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
30de0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
30df0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
30e00 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
30e10 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
30e20 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
30e30 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
30e40 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
30e50 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
30e60 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
30e70 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
30e80 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
30e90 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
30ea0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
30eb0 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
30ec0 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
30ed0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
30ee0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
30ef0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
30f00 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
30f10 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
30f20 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
30f30 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
30f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
30f50 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
30f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30f70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30f80 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
30f90 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  er is in locking
30fa0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
30fb0 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69  mode, the lock i
30fc0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67  s.      ** downg
30fd0 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f  raded to SHARED_
30fe0 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73  LOCK before this
30ff0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
31000 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
31010 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
31020 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
31030 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
31040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
31060 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31070 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49    }. .      /* I
31080 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
31090 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65  ady open and the
310a0 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20   file exists on 
310b0 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a  disk, open the .
310c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
310d0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
310e0 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63  access. Write ac
310f0 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64  cess is required
31100 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20   because .      
31110 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ** in exclusive-
31120 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
31130 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
31140 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
31150 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  n .      ** and 
31160 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
31170 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
31180 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20  later on. Also, 
31190 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20  write-access .  
311a0 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c      ** is usuall
311b0 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  y required to fi
311c0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
311d0 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  al in journal_mo
311e0 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20  de=persist .    
311f0 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61    ** mode (and a
31200 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f  lso for journal_
31210 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e  mode=truncate on
31220 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a   some systems)..
31230 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31240 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
31250 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
31260 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
31270 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
31280 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
31290 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
312a0 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
312b0 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
312c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
312d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
312e0 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
312f0 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
31300 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  , it .      ** m
31310 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
31320 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
31330 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
31340 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  en this.      **
31350 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
31360 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
31370 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
31380 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
31390 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
313a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
313b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
313c0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
313d0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
313e0 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  pVfs;.        in
313f0 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20  t bExists;      
31400 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31410 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
31420 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
31430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31440 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
31450 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
31460 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
31470 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
31480 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20  , &bExists);.   
31490 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
314a0 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74  ITE_OK && bExist
314b0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
314c0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
314d0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
314e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
314f0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
31500 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
31510 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31520 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31530 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
31540 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
31550 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
31560 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
31570 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
31580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
31590 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
315a0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
315b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
315c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
315d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
315e0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
315f0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
31600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31610 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
31620 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31630 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31640 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31660 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
31670 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
31680 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
31690 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
316a0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
316b0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
316c0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
316d0 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
316e0 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
316f0 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
31700 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
31710 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
31720 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
31730 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
31740 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
31750 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a    Sync the hot j
31760 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31770 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  aying.      ** i
31780 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65  t back since the
31790 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
317a0 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74  ashed and left t
317b0 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20  he hot journal. 
317c0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
317d0 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74   did not sync it
317e0 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75   and we are requ
317f0 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73  ired to always s
31800 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ync.      ** the
31810 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31820 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e  playing it back.
31830 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31840 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
31850 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31860 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31870 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
31880 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
31890 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
318a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
318b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
318c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
318d0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
318e0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
318f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
31900 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
31910 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EN;.        }.  
31920 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
31930 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31940 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
31950 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31960 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31970 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
31980 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
319a0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
319b0 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72  s taken if an er
319c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
319d0 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a   trying to open.
319e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f          ** or ro
319f0 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ll back a hot-jo
31a00 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64  urnal while hold
31a10 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
31a20 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
31a30 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     ** pager_unlo
31a40 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
31a50 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  l be called befo
31a60 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20  re returning to 
31a70 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a  unlock.        *
31a80 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  * the file. If t
31a90 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70  he unlock attemp
31aa0 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61  t fails, then Pa
31ab0 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ger.eLock must b
31ac0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
31ad0 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
31ae0 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
31af0 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
31b00 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20  ine for .       
31b10 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   ** UNKNOWN_LOCK
31b20 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78   above for an ex
31b30 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20  planation). .   
31b40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31b50 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67  ** In order to g
31b60 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  et pager_unlock(
31b70 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65  ) to do this, se
31b80 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  t Pager.eState t
31b90 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47  o.        ** PAG
31ba0 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68  ER_ERROR now. Th
31bb0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
31bc0 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20  ly counted as a 
31bd0 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20  transition.     
31be0 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73     ** to ERROR s
31bf0 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74  tate in the stat
31c00 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65  e diagram at the
31c10 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
31c20 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  e,.        ** si
31c30 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
31c40 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74   the same call t
31c50 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
31c60 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20   will very.     
31c70 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72     ** shortly tr
31c80 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67  ansition the pag
31c90 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
31ca0 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c   OPEN state. Cal
31cb0 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ling.        ** 
31cc0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
31cd0 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20  te() would fail 
31ce0 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c  now, as it shoul
31cf0 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  d not be possibl
31d00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
31d10 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  be in ERROR stat
31d20 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  e when there are
31d30 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e   zero outstandin
31d40 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20  g page .        
31d50 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20  ** references.. 
31d60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31d70 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
31d80 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
31d90 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31da0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
31db0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31dc0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
31dd0 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
31de0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
31df0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  k==SHARED_LOCK).
31e00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
31e10 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31e20 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
31e30 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
31e40 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  K).      );.    
31e50 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
31e60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
31e70 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
31e80 73 65 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sed ){.      /* 
31e90 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
31ea0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
31eb0 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
31ec0 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
31ed0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
31ee0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
31ef0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
31f00 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
31f10 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
31f20 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
31f30 65 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65  e pPager->hasBee
31f40 6e 55 73 65 64 20 66 6c 61 67 20 70 72 65 76 65  nUsed flag preve
31f50 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
31f60 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
31f70 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
31f80 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
31f90 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
31fa0 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
31fb0 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
31fc0 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
31fd0 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
31fe0 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
31ff0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
32000 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
32010 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32020 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32030 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32040 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32050 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32060 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
32070 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
32080 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32090 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
320a0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
320b0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
320c0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
320d0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
320e0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
320f0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32100 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32110 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32120 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32130 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32140 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32150 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32160 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
32170 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
32180 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32190 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
321a0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
321b0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
321c0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
321d0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
321e0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
321f0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32200 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32210 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32220 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32230 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32240 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32250 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32260 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32270 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32280 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32290 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
322a0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
322b0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
322c0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
322d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
322e0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
322f0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32300 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32310 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
32320 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32330 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
32340 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
32350 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
32360 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
32380 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
32390 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
323a0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
323b0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
323c0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
323d0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
323e0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
323f0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32400 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
32410 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
32420 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
32430 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
32440 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
32450 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
32460 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
32470 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
32480 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
32490 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
324a0 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
324b0 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
324c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
324d0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
324e0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
324f0 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
32500 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
32510 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
32520 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
32530 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
32540 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
32550 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
32560 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
32570 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
32580 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
32590 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
325a0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
325b0 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
325c0 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
325d0 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
325e0 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
325f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32600 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
32610 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
32620 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32630 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
32640 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
32650 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
32660 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
32670 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
32680 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
32690 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
326a0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
326b0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
326c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
326d0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
326e0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
326f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32700 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
32710 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
32720 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
32730 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
32740 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
32750 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32760 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32770 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
32780 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
32790 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
327a0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
327b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
327c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
327d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
327e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
327f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
32800 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
32810 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
32820 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
32830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
32840 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32850 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
32860 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32870 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32880 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32890 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
328a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
328b0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
328c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
328d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
328e0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
328f0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
32900 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
32910 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
32920 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
32930 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
32940 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
32950 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
32960 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
32970 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
32980 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
32990 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
329a0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
329b0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
329c0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
329d0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
329e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
329f0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
32a00 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
32a10 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
32a20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
32a30 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
32a40 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
32a50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
32a60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
32a70 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
32a80 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
32a90 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32aa0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
32ab0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32ac0 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
32ad0 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
32ae0 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
32af0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
32b00 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
32b10 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
32b20 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
32b30 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
32b40 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
32b50 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
32b60 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
32b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
32b80 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
32b90 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32ba0 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
32bb0 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
32bc0 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
32bd0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
32be0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
32bf0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
32c00 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
32c10 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
32c20 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
32c30 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
32c40 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
32c50 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
32c60 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
32c70 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
32c80 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
32c90 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
32ca0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
32cb0 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
32cc0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
32cd0 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
32ce0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
32cf0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
32d00 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
32d10 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
32d20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
32d30 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
32d40 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
32d50 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
32d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32d70 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
32d80 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
32d90 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
32da0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
32db0 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
32dc0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
32dd0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
32de0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
32df0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
32e00 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
32e10 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
32e20 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
32e30 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
32e40 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
32e50 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
32e60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
32e70 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
32e80 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
32e90 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
32ea0 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
32eb0 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
32ec0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
32ed0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
32ee0 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
32ef0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
32f00 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
32f10 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
32f20 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
32f30 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
32f40 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
32f50 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
32f60 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
32f70 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
32f80 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
32f90 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
32fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
32fb0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
32fc0 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
32fd0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
32fe0 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
32ff0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
33000 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
33010 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
33020 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
33030 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
33040 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
33050 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
33060 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33070 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
33080 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
33090 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
330a0 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
330b0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
330c0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
330d0 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
330e0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
330f0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
33100 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
33110 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
33120 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
33130 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
33140 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
33150 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
33160 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
33170 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
33180 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
33190 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
331a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
331b0 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
331c0 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
331d0 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
331e0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
331f0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
33200 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
33210 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
33220 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
33230 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
33240 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
33250 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
33260 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
33270 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
33280 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
33290 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
332a0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
332b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
332c0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
332d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
332e0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
332f0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
33300 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
33310 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
33320 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
33330 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
33340 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
33350 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
33360 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
33370 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
33380 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
33390 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
333a0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
333b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
333c0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
333d0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
333e0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
333f0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
33400 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
33410 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
33420 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
33430 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
33440 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
33450 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
33460 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
33470 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
33480 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
33490 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
334a0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
334b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
334c0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
334d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
334e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
334f0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
33500 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
33510 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
33520 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
33530 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
33540 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
33550 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
33560 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
33570 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
33580 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
33590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
335a0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
335b0 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
335c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
335d0 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
335e0 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
335f0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  le */.  const in
33600 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66  t noContent = (f
33610 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
33620 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20  _NOCONTENT);..  
33630 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
33640 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
33650 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
33660 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
33670 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
33680 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
33690 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
336a0 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
336b0 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
336c0 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
336d0 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
336e0 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
336f0 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
33700 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
33710 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
33720 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
33730 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
33740 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31  mapOk = (pgno!=1
33750 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33760 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33770 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33780 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33790 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
337a0 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
337b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
337c0 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
337d0 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
337e0 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
337f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33800 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33810 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33820 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33830 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33840 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33850 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
33860 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
33870 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33880 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33890 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
338a0 3e 68 61 73 42 65 65 6e 55 73 65 64 20 3d 20 31  >hasBeenUsed = 1
338b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
338c0 69 73 20 61 6e 20 55 4e 4c 4f 43 4b 45 44 20 74  is an UNLOCKED t
338d0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
338e0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 72 65  he page being re
338f0 61 64 20 77 61 73 0a 20 20 2a 2a 20 70 72 65 73  ad was.  ** pres
33900 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
33910 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
33920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
33930 73 20 6f 70 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d  s opened,.  ** m
33940 61 72 6b 20 69 74 20 61 73 20 72 65 61 64 20 69  ark it as read i
33950 6e 20 74 68 65 20 70 41 6c 6c 52 65 61 64 20 76  n the pAllRead v
33960 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28  ector.  */.  if(
33970 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
33980 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65  d && pgno<=pPage
33990 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
339a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
339b0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
339c0 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e  r->pAllRead, pgn
339d0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
339e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
339f0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33a00 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rr;.  }..  /* If
33a10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33a20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33a30 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
33a40 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33a50 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33a60 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
33a70 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
33a80 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
33a90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33ab0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
33ac0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
33ad0 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  {.    if( bMmapO
33ae0 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
33af0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33b10 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
33b20 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
33b30 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
33b40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33b50 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
33b60 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
33b70 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  ..    if( bMmapO
33b80 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
33b90 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
33ba0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ata = 0;..      
33bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
33bc0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
33bd0 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29  .          (i64)
33be0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
33bf0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
33c00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
33c10 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a  pData.      );..
33c20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33c30 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
33c40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
33c50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
33c60 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
33c70 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73           pPg = s
33c80 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33c90 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
33ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33cb0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
33cc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33cd0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
33ce0 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
33cf0 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
33d00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33d10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33d20 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
33d30 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
33d40 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
33d50 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
33d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33d70 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
33d80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
33d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33da0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33db0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
33dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33dd0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
33de0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
33df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33e00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
33e10 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
33e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33e30 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
33e40 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
33e50 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61  pBase;.      pBa
33e60 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
33e70 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
33e80 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
33e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61  );.      if( pBa
33ea0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
33eb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
33ec0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
33ed0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
33ee0 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
33ef0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33f00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33f10 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33f20 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
33f30 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
33f40 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
33f50 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
33f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
33f70 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
33f80 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33f90 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d  e_err;.        }
33fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
33fb0 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
33fc0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
33fd0 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
33fe0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
33ff0 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Base);.      ass
34000 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
34010 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
34020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34030 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
34040 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
34050 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
34060 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
34070 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
34080 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
34090 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
340a0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
340b0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
340c0 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
340d0 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
340e0 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
340f0 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
34100 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
34110 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34120 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
34130 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
34140 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
34150 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
34160 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
34170 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34180 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
34190 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==0 );..  if( p
341a0 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
341b0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
341c0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
341d0 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
341e0 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
341f0 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
34200 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
34210 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
34220 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
34230 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34240 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
34250 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
34260 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34270 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
34280 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
34290 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
342a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
342b0 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
342c0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
342d0 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
342e0 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
342f0 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
34300 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
34310 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
34320 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
34330 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
34340 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
34350 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
34360 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
34370 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
34380 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
34390 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
343a0 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
343b0 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
343c0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
343d0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
343e0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
343f0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
34400 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
34410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34420 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34430 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34440 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
34450 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
34460 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
34470 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
34480 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
34490 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
344a0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
344b0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
344c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
344d0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
344e0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
344f0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34500 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
34510 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
34520 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
34530 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
34540 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
34550 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
34560 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
34570 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
34580 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
34590 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
345a0 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
345b0 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
345c0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
345d0 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
345e0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
345f0 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
34600 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
34610 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
34620 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
34630 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
34640 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
34650 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
34660 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
34670 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34680 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
34690 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
346a0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
346b0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
346c0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
346d0 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
346e0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
346f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
34700 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
34710 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34720 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
34740 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34750 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
34760 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
34770 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
34780 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
34790 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
347a0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
347b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
347c0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
347d0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
347e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
347f0 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
34800 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
34810 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
34820 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34830 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
34840 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62  Wal(pPager) && b
34850 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  MmapOk==0 ){.   
34860 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34870 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
34880 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
34890 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
348a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
348b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
348c0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
348d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
348e0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
348f0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
34900 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34910 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
34920 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
34930 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
34940 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
34950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34960 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34970 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34980 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34990 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
349a0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
349b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
349c0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
349d0 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
349e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
349f0 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
34a00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
34a10 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
34a20 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
34a30 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34a40 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
34a50 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
34a60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
34a70 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
34a80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34a90 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
34aa0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
34ab0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
34ac0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
34ad0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
34ae0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
34af0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34b00 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
34b10 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
34b20 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
34b30 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
34b40 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
34b50 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
34b60 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
34b70 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
34b80 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
34b90 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
34ba0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
34bb0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
34bc0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
34bd0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
34be0 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
34bf0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
34c00 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
34c10 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
34c20 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
34c30 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
34c40 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
34c60 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
34c70 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34c80 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
34c90 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
34ca0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
34cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34cc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
34cd0 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
34ce0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34cf0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
34d00 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
34d10 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
34d20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65  || pPager->hasBe
34d30 65 6e 55 73 65 64 20 29 3b 0a 20 20 69 66 28 20  enUsed );.  if( 
34d40 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
34d50 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
34d60 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34d70 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
34d80 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
34d90 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
34da0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
34db0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
34dc0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
34dd0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
34de0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
34df0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
34e00 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
34e10 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
34e20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
34e30 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
34e40 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
34e50 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
34e60 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
34e70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
34e80 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
34e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
34ea0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
34eb0 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  l(DbPage *pPg){.
34ec0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
34ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
34ee0 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  0 );.  pPager = 
34ef0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
34f00 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
34f10 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
34f20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
34f30 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
34f40 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
34f50 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
34f60 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
34f70 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
34f80 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ager);.}.void sq
34f90 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
34fa0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
34fb0 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65  if( pPg ) sqlite
34fc0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
34fd0 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll(pPg);.}../*.*
34fe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34ff0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
35000 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
35010 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
35020 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
35030 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
35040 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
35050 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
35060 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
35070 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
35080 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
35090 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
350a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
350b0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
350c0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
350d0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
350e0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
350f0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
35100 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
35110 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
35120 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
35130 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35140 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
35150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35160 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
35170 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
35180 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
35190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
351a0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
351b0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
351c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
351d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
351e0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
351f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35200 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
35210 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
35220 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
35230 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
35240 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
35250 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
35260 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
35270 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
35280 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
35290 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
352a0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
352b0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
352c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
352d0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
352e0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
352f0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
35300 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
35310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
35320 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
35330 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
35340 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
35350 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
35360 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
35370 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
35380 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
35390 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
353a0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
353b0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
353c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
353d0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
353e0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
353f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
35400 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
35410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
35420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35430 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
35440 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
35450 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
35460 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
35470 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
35480 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
35490 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
354a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
354b0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
354c0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
354d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
354e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
354f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35500 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
35510 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
35520 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
35530 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
35540 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
35550 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
35560 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
35570 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
35580 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
35590 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
355a0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
355b0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
355c0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
355d0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
355e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
355f0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
35600 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
35610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
35620 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
35630 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
35640 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35650 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
35660 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
35670 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
35680 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
35690 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
356a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
356b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
356c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
356d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
356e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
356f0 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
35700 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
35710 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
35720 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
35730 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
35740 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
35750 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
35760 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
35770 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
35780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35790 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
357a0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
357b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
357c0 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
357d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
357e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
357f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
35800 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
35810 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
35820 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
35830 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
35840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
35850 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
35860 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
35870 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
35880 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
35890 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
358a0 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
358b0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
358c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
358d0 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65  ill has the same
358e0 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20   name as it did 
358f0 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
35900 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
35910 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
35920 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61       rc = databa
35930 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67  seIsUnmoved(pPag
35940 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
35950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35960 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
35970 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
35980 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63  ITE.          rc
35990 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
359a0 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
359b0 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
359c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
359d0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
359e0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
359f0 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20  pPager).        
35a00 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
35a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a20 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
35a30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
35a40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
35a50 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
35a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
35a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
35a90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35aa0 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
35ab0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
35ac0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
35ad0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
35ae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
35af0 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
35b00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
35b10 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
35b20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
35b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b40 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
35b50 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
35b60 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
35b70 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
35b80 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
35b90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
35ba0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
35bb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
35bc0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
35bd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
35be0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
35bf0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
35c00 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
35c10 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
35c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35c30 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
35c40 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
35c50 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
35c60 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
35c70 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
35c80 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
35c90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35ca0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
35cb0 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
35cc0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
35cd0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35ce0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
35cf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
35d00 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
35d10 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
35d20 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
35d30 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
35d40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35d50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
35d60 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
35d70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
35d80 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
35d90 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
35da0 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71 75   is 0, then acqu
35db0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
35dc0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
35dd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35de0 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
35df0 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71 75  is >0, then acqu
35e00 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
35e10 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35e20 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
35e30 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
35e40 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
35e50 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
35e60 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
35e70 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29 20  * If (exFlag<0) 
35e80 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
35e90 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
35ea0 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e 79   do not take any
35eb0 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 74   locks..** The t
35ec0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
35ed0 72 75 6e 20 69 6e 20 55 4e 4c 4f 43 4b 45 44 20  run in UNLOCKED 
35ee0 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  mode instead..**
35ef0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
35f00 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
35f10 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
35f20 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
35f30 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
35f40 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35f50 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
35f60 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
35f70 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
35f80 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
35f90 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
35fa0 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
35fb0 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
35fc0 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
35fd0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
35fe0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
35ff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
36000 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
36010 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
36020 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
36030 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
36040 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
36050 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
36060 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
36070 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
36080 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
36090 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
360a0 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
360b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
360c0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
360d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
360e0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
360f0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
36100 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
36110 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
36120 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
36130 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
36140 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36150 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36160 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36170 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36180 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36190 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
361a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
361b0 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
361c0 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
361d0 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
361e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
361f0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
36200 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36210 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
36220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36230 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30  ger->pAllRead==0
36240 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
36250 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36260 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
36270 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
36280 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36290 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
362a0 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
362b0 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
362c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
362d0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
362e0 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
362f0 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
36300 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36310 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36320 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
36330 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36340 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
36350 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36360 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36370 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36380 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
363a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
363b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
363c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
363d0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
363e0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
363f0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36400 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
36410 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
36420 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
36430 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
36440 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
36450 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
36460 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
36470 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
36480 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
36490 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
364a0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
364b0 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
364c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
364d0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
364e0 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
364f0 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
36500 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
36510 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
36520 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36530 20 20 69 66 28 20 65 78 46 6c 61 67 3e 3d 30 20    if( exFlag>=0 
36540 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36550 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
36560 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
36570 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
36580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36590 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
365a0 52 65 61 64 20 3d 20 73 71 6c 69 74 65 33 42 69  Read = sqlite3Bi
365b0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
365c0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
365d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
365e0 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20  pAllRead==0 ){. 
365f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
36600 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
36610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36630 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
36640 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20 31 29 3b  r->pAllRead, 1);
36650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36660 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36670 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
36680 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
36690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
366a0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
366b0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
366c0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
366d0 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
366e0 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
366f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36700 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
36710 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
36720 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
36730 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
36740 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
36750 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
36760 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
36770 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
36780 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
36790 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
367a0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
367b0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
367c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
367d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
367e0 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  lag>0 ){.       
367f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
36800 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
36810 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36850 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
36860 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
36870 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36880 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
36890 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
368a0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
368b0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
368c0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
368d0 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
368e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
368f0 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
36900 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
36910 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
36920 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
36930 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
36940 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
36950 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
36960 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
36970 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
36980 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36990 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
369a0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
369b0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
369c0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
369d0 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
369e0 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
369f0 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
36a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
36a10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
36a20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36a30 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
36a40 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
36a50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36a60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36a70 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
36a80 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36a90 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
36aa0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36ab0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
36ad0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
36ae0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36af0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
36b00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
36b10 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
36b20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
36b30 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
36b40 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36b50 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
36b60 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36b70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36b80 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
36b90 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
36ba0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
36bb0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
36bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36bd0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
36be0 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
36bf0 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
36c00 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
36c10 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
36c20 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pagerAd
36c30 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
36c40 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
36c50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
36c60 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36c70 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  r;.  int rc;.  u
36c80 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72  32 cksum;.  char
36c90 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20   *pData2;.  i64 
36ca0 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
36cb0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
36cc0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
36cd0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
36ce0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
36cf0 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  age that.  ** co
36d00 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
36d10 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
36d20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
36d30 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74   verifies.  ** t
36d40 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
36d50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
36d60 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
36d70 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
36d80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36d90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
36da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36db0 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50  f );.  CODEC2(pP
36dc0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
36dd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
36de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
36df0 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
36e00 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
36e10 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
36e20 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
36e30 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
36e40 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
36e50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
36e60 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
36e70 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
36e80 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
36e90 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
36ea0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
36eb0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
36ec0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
36ed0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
36ee0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
36ef0 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
36f00 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
36f10 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
36f20 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
36f30 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
36f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36f50 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
36f60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
36f70 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
36f80 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
36f90 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
36fa0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
36fb0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
36fc0 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
36fd0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
36fe0 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
36ff0 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  if( rc
37000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37010 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
37020 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37030 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
37040 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
37050 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
37060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37070 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37080 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37090 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
370a0 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
370b0 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
370c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
370d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
370e0 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  ;..  IOTRACE(("J
370f0 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
37100 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
37110 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37120 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37130 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
37140 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50  >pageSize));.  P
37150 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37160 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37170 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52  ount);.  PAGERTR
37180 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
37190 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
371a0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
371b0 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52  n",.       PAGER
371c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
371d0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28  >pgno, .       (
371e0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
371f0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37200 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
37210 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61  h(pPg)));..  pPa
37220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37230 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
37240 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
37250 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73  r->nRec++;.  ass
37260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37270 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
37280 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
37290 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
372a0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
372b0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
372c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
372d0 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EM );.  assert( 
372e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
372f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
37300 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64  M );.  rc |= add
37310 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
37320 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
37330 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
37340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
37350 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37360 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
37370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37380 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
37390 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
373a0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
373b0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
373c0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
373d0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
373e0 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
373f0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37400 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
37410 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
37420 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37430 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
37440 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
37450 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
37460 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
37470 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
37480 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
37490 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
374a0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
374b0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
374c0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
374d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
374e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
374f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
37500 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37510 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
37520 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
37530 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
37540 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
37550 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
37560 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
37570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
37580 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
37590 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
375a0 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
375b0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
375c0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
375d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
375e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
375f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37600 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
37610 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37620 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37630 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
37640 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37650 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37660 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37670 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37680 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37690 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
376a0 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
376b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
376c0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
376d0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
376e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
376f0 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
37700 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
37710 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
37720 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
37730 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
37740 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
37750 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
37760 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37770 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
37780 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
37790 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
377a0 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
377b0 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
377c0 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
377d0 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
377e0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
377f0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37800 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
37810 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
37820 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
37830 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
37840 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37850 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
37860 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37870 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
37880 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
37890 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
378a0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
378b0 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
378c0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
378d0 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
378e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
378f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37900 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
37910 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
37920 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
37930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37940 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37950 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
37960 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37970 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
37980 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
37990 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
379a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
379b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
379c0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
379d0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64   about to be mod
379e0 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e 20  ified as dirty. 
379f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
37a00 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
37a10 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c  ;..  /* If a rol
37a20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73  lback journal is
37a30 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61   in use, them ma
37a40 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67 65  ke sure the page
37a50 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20   that is about. 
37a60 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73   ** to change is
37a70 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
37a80 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20   journal, or if 
37a90 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e 65  the page is a ne
37aa0 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20  w page off.  ** 
37ab0 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20  then end of the 
37ac0 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  file, make sure 
37ad0 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
37ae0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e  PGHDR_NEED_SYNC.
37af0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37b00 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37b10 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65  nal!=0) == isOpe
37b20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
37b30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
37b40 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20  pInJournal!=0.  
37b50 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76 65   && sqlite3Bitve
37b60 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61  cTestNotNull(pPa
37b70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37b80 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20   pPg->pgno)==0. 
37b90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37ba0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37bb0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  er)==0 );.    if
37bc0 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
37bd0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
37be0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
37bf0 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
37c00 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29  backJournal(pPg)
37c10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37c30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37c40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
37c50 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e{.      if( pPa
37c60 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
37c70 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
37c80 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
37c90 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37ca0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
37cb0 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
37cc0 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
37cd0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37ce0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
37cf0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37d00 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
37d20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
37d30 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
37d40 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
37d50 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49   /* The PGHDR_DI
37d60 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20 61  RTY bit is set a
37d70 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70 61  bove when the pa
37d80 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  ge was added to 
37d90 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20  the dirty-list. 
37da0 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77   ** and before w
37db0 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
37dc0 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
37dd0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74  k journal.  Wait
37de0 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a   until now,.  **
37df0 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65 20   after the page 
37e00 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
37e10 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64  fully journalled
37e20 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67  , before setting
37e30 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f   the.  ** PGHDR_
37e40 57 52 49 54 45 41 42 4c 45 20 62 69 74 20 74 68  WRITEABLE bit th
37e50 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
37e60 74 20 74 68 65 20 70 61 67 65 20 63 61 6e 20 62  t the page can b
37e70 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 69 65  e safely modifie
37e80 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  d..  */.  pPg->f
37e90 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 57 52  lags |= PGHDR_WR
37ea0 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a  ITEABLE;.  .  /*
37eb0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
37ec0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
37ed0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
37ee0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
37ef0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
37f00 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
37f10 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37f20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
37f30 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
37f40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75  0 ){.    rc = su
37f50 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
37f60 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20 20 7d  quired(pPg);.  }
37f70 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
37f80 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
37f90 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  and return. */. 
37fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
37fb0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
37fc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
37fd0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
37fe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
38000 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20  is a variant of 
38010 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
38020 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77 68  e() that runs wh
38030 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  en the sector si
38040 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  ze.** is larger 
38050 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73 69  than the page si
38060 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65  ze.  SQLite make
38070 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c  s the (reasonabl
38080 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68  e) assumption th
38090 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20  at.** all bytes 
380a0 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65 20  of a sector are 
380b0 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72  written together
380c0 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20 48   by hardware.  H
380d0 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20  ence, all bytes 
380e0 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e  of.** a sector n
380f0 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
38100 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20  lled in case of 
38110 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20  a power loss in 
38120 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
38130 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20   a write..**.** 
38140 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63  Usually, the sec
38150 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73  tor size is less
38160 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
38170 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c  o the page size,
38180 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73   in which.** cas
38190 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20 69  e pages can be i
381a0 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74  ndividually writ
381b0 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ten.  This routi
381c0 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20  ne only runs in 
381d0 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e  the.** exception
381e0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 74 68  al case where th
381f0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
38200 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
38210 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a  sector size..*/.
38220 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
38230 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
38240 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f 72  WriteLargeSector
38250 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
38260 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
38270 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
38280 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
38290 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
382a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
382b0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
382c0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
382d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
382e0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
382f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
38300 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
38310 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
38320 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69 6e  ated on. */.  in
38330 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
38340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
38350 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
38360 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
38370 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
38380 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
38390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
383a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
383b0 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
383c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
383d0 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
383e0 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
383f0 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72 20  SYNC */.  Pager 
38400 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
38410 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 70 61  Pager; /* The pa
38420 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70 50  ger that owns pP
38430 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67  g */.  Pgno nPag
38440 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
38450 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
38460 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
38470 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  e);..  /* Set th
38480 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
38490 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68  YNC bit to 1. Th
384a0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
384b0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
384c0 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
384d0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
384e0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
384f0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
38500 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
38510 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ion..  */.  asse
38520 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
38530 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
38540 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
38550 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d  ILLFLAG_NOSYNC)=
38560 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
38570 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
38580 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a  ILLFLAG_NOSYNC;.
38590 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b  .  /* This trick
385a0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
385b0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
385c0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
385d0 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 74   are.  ** an int
385e0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
385f0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
38600 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
38610 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66 20  ntifier.  ** of 
38620 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
38630 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
38640 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
38650 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28 70    */.  pg1 = ((p
38660 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
38670 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
38680 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67 65  )) + 1;..  nPage
38690 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  Count = pPager->
386a0 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50  dbSize;.  if( pP
386b0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
386c0 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  nt ){.    nPage 
386d0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
386e0 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69  g1)+1;.  }else i
386f0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
38700 53 65 63 74 6f 72 2d 31 29 3e