/ Hex Artifact Content
Login

Artifact f9319b4082ecc7c11e515c292406a39131f1fe00f515f5a5185272fdcd24477c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9650: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9660: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9670: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9680: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9690: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96a0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96b0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96c0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96d0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
96e0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
96f0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9700: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9720: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9730: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9740: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9750: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9760: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9770: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9780: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9790: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97a0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97b0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97c0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97d0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
97e0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
97f0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9800: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9810: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9830: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9850: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9870: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9890: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98a0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
98e0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
98f0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9900: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9910: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9920: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9940: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9950: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9960: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9970: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9980: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9990: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99a0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99b0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99c0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99d0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
99e0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
99f0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a30: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a40: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a50: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a60: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a70: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9a80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9a90: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9aa0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ab0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ac0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9ad0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9ae0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9af0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b00: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b10: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b20: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b30: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b40: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b50: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b60: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b70: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9b80: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9b90: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9ba0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bb0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9bc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bd0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c00: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c20: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c30: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c50: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c60: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9c80: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9c90: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9ca0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cb0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9cc0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9ce0: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9cf0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d00: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d10: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d20: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d30: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d50: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d60: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9d80: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9d90: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9da0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9db0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9dc0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9dd0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9de0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9df0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e10: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e30: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e70: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9e80: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9e90: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ea0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9eb0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ec0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ed0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9ee0: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9ef0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f00: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f10: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f20: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f30: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f40: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f50: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f60: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f70: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9f80: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9f90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fa0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fb0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fc0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9fd0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9fe0: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ff0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a010: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a030: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a040: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a050: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a060: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a070: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a080: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a090: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0a0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0c0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a0e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a0f0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a110: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a120: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a130: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a140: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a150: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a160: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a170: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a180: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a190: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1a0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1b0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1c0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1d0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a1e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a1f0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a200: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a210: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a230: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a240: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a250: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a260: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a270: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a280: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a290: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2a0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2b0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a2e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a310: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a320: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a330: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a340: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a350: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a360: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3d0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a3e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a400: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a410: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a420: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a430: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a450: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a460: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a470: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4a0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a4e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a510: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a520: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a540: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a550: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a570: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a580: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a590: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5b0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a600: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a610: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a620: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a630: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a640: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a660: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a670: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a690: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6a0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6b0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6c0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6d0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a6e0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a6f0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a700: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a710: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a720: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a740: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a760: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a770: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a780: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a790: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a7e0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a820: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a850: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a860: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a870: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a880: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a890: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8f0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a900: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a920: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a930: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a940: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a950: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a960: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a970: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a980: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a990: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a9f0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa10: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa30: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa40: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa60: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa70: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aa80: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aa90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aaa0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aac0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aad0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
aae0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aaf0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab10: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab20: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab60: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab70: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab80: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ab90: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
aba0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abb0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abc0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abd0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
abf0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac00: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac10: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac20: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac30: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac40: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac50: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac60: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac70: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ac80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ac90: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
aca0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
acc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acd0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ace0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
acf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad00: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad10: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad20: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad40: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad50: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ad80: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ad90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ada0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
adb0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
adc0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
add0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ade0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
adf0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae10: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae30: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae50: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae60: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae70: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
ae80: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
ae90: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aea0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aec0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aed0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
aee0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
aef0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af00: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af10: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af20: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af30: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af40: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af50: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af60: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
af80: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
af90: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afa0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afb0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afc0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
afd0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
afe0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
aff0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b000: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b010: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b020: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b030: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b040: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b050: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b060: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b070: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b080: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0a0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0b0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0c0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b0e0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b0f0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b100: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b110: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b120: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b130: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b140: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b150: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b160: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b170: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b180: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b190: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1a0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1d0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b1e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b1f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b200: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b210: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b220: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b230: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b240: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b250: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b260: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b270: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b280: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b290: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2a0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2d0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b2e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b2f0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b300: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b310: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b320: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b330: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b340: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b350: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b360: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b370: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b380: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3a0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3b0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3e0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b3f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b400: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b410: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b420: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b440: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b450: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b460: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b470: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b480: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b490: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4a0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4b0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b4e0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b4f0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b500: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b510: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b520: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b530: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b540: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b560: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b570: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b580: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b590: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5b0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5d0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b5e0: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b5f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b600: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b610: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b620: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b630: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b640: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b650: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b670: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b680: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b690: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6a0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6c0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b6e0: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b6f0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b700: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b720: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b730: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b740: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b750: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b760: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b770: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b780: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b790: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7a0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7b0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7d0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b7e0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b800: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b810: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b820: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b830: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b840: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b850: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b870: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b880: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b890: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8a0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8b0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8c0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8d0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b8e0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b8f0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b900: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b910: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b920: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b930: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b940: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b950: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b960: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b970: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b980: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b990: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9a0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9b0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9c0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b9e0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b9f0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba20: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba60: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba70: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
ba80: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
ba90: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
baa0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bab0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bac0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
baf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb20: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bb80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bb90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bba0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbb0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbc0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbd0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bbf0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc00: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc20: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc30: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc40: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc70: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bc80: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bc90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bca0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcb0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bcc0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bcf0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd00: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd10: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd20: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd30: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd40: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd50: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bd80: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bd90: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdb0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bdc0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdd0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
bde0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bdf0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be00: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be10: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be20: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be50: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
be80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
be90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bea0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
beb0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bec0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bed0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bee0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bef0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf00: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf10: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf30: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf40: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf50: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bf80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bf90: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfa0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfb0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfc0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bfd0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
bfe0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
bff0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c000: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c010: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c020: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c030: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c040: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c050: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c060: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c070: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c080: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c090: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0b0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0c0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0d0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c0e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c0f0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c100: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c140: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c150: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c160: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c170: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c180: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c190: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c1f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c200: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c210: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c220: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c230: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c240: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c250: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c260: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c270: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c280: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c290: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2a0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2c0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2d0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c310: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c320: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c330: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c340: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c350: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c360: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c370: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c380: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c390: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3a0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3b0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3c0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3d0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c3e0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c3f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c400: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c410: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c420: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c430: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c440: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c450: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c460: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c470: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c480: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c490: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4c0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4d0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c4e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c4f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c500: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c510: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c520: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c530: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c540: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c550: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c560: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c570: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c590: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5a0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c5f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c600: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c610: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c620: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c630: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c640: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c650: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c660: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c680: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c690: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6c0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6d0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c6e0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c6f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c700: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c710: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c720: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c730: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c740: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c750: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c760: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c770: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c780: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c790: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c7e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c7f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c800: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c810: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c820: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c830: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c840: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c850: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c860: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c870: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c880: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c890: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8b0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8d0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c8e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c8f0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c900: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c910: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c920: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c930: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c940: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c950: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c960: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c970: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9a0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
c9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c9f0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca10: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca20: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca50: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca60: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ca80: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
caa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6e  pPager->fd);.#en
cac0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
cad0: 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
cae0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 69  ATOMIC_WRITE.  i
caf0: 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49 4f 43  f( dc&SQLITE_IOC
cb00: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
cb10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
cb20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
cb30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cb40: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
cb50: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65 63    {.    int nSec
cb60: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
cb70: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e  ctorSize;.    in
cb80: 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
cb90: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
cba0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
cbb0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
cbc0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
cbd0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
cbe0: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
cbf0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
cc00: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
cc10: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
cc20: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
cc30: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
cc40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cc50: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
cc60: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
cc70: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cc80: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
cc90: 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ccb0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
ccc0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
ccd0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
cce0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
ccf0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
cd00: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
cd10: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
cd20: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
cd30: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
cd40: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
cd50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
cd60: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
cd70: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
cd80: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
cd90: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
cda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
cdb0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
cdc0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
cdd0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
cde0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
cdf0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ce00: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
ce10: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
ce20: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
ce30: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
ce40: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
ce50: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
ce60: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
ce70: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
ce80: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
ce90: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
cea0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
ceb0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
cec0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
ced0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
cee0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
cef0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
cf00: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
cf10: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
cf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
cf30: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
cf40: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
cf50: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
cf60: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cf70: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
cf80: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
cf90: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
cfa0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
cfb0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
cfc0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
cfd0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
cfe0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
cff0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
d000: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
d010: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
d020: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
d030: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
d040: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
d050: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
d060: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
d070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d080: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
d090: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
d0a0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
d0b0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
d0c0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
d0d0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
d0e0: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
d0f0: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
d100: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
d110: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
d120: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
d130: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
d140: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
d150: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
d160: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
d170: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
d180: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
d190: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
d1a0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
d1b0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
d1c0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
d1d0: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
d1e0: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
d1f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d200: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
d210: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
d220: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
d230: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
d240: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
d250: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
d260: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
d270: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
d280: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
d290: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
d2a0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
d2b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d2c0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
d2d0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
d2e0: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
d2f0: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
d300: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
d310: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
d320: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
d330: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
d340: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
d350: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
d360: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
d370: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
d380: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
d390: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
d3a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d3b0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
d3c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
d3d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
d3e0: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
d3f0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
d400: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
d410: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
d420: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
d430: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
d440: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
d450: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
d460: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
d470: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
d480: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d490: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
d4a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d4b0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
d4c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
d4d0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
d4e0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
d4f0: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
d500: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
d510: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
d520: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
d530: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
d540: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
d550: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
d560: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
d570: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
d580: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d590: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
d5a0: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
d5b0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
d5c0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
d5d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d5e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
d5f0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
d600: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
d610: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
d620: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
d630: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
d640: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
d650: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
d660: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
d670: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
d680: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d6b0: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
d6e0: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
d6f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d700: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d720: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
d730: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
d740: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
d750: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
d760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
d770: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
d780: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d790: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d7c0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d7d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d7e0: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d7f0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d800: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d810: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d820: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d830: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d840: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d850: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d860: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d870: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d880: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d890: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d8a0: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d8b0: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d8c0: 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c  n>szJ-16.   || l
d8d0: 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c  en==0 .   || SQL
d8e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d8f0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d900: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
d910: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d920: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d930: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
d940: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
d950: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
d960: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
d970: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
d980: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d990: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d9a0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
d9b0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
d9c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d9d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
d9e0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
d9f0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
da00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
da10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
da20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
da30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
da40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
da50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
da60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
da70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
da80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
da90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
daa0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
dab0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
dac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
dad0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
dae0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
daf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
db00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
db10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
db20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
db30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
db40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
db50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
db60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
db70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
db80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
db90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dba0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
dbb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
dbc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
dbd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
dbe0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
dbf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
dc00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
dc10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
dc20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
dc30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
dc40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
dc50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
dc60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
dc70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
dc80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
dc90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
dca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcc0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
dd10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
dd20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
dd30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
dd40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
dd50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
dd60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
dd70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
dd80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
dd90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
dda0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ddb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
ddc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
ddd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
dde0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
ddf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
de00: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
de10: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
de20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
de30: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
de40: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
de50: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
de60: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
de70: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
de80: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
de90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dea0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
deb0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dec0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ded0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
dee0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
def0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
df00: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
df10: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
df20: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
df30: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
df40: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
df50: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
df60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
df70: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
df80: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
df90: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
dfa0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
dfb0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
dfc0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
dfd0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
dfe0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
dff0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
e000: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
e010: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
e020: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e030: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
e040: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
e050: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
e060: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
e070: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
e080: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
e090: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
e0a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
e0b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
e0c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
e0d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
e0e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
e0f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
e100: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
e110: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
e120: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
e130: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
e140: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
e150: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
e160: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
e170: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
e180: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
e190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
e1a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
e1b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
e1c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e1d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
e1e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
e1f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e200: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
e210: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e220: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
e230: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
e240: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
e250: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
e260: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
e270: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
e280: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
e290: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
e2a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
e2b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e2c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e2f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
e300: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e310: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
e320: 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72  rt( !sqlite3Jour
e330: 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
e340: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
e350: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
e360: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f  nalOff ){.    co
e370: 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d  nst i64 iLimit =
e380: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e390: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a  SizeLimit;    /*
e3a0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
e3b0: 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52  jsl */..    IOTR
e3c0: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
e3d0: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
e3e0: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
e3f0: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
e400: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e410: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
e420: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
e430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e440: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
e450: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
e460: 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d   {0};.      rc =
e470: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
e480: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72  pPager->jfd, zer
e490: 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72  oHdr, sizeof(zer
e4a0: 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oHdr), 0);.    }
e4b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e4c0: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
e4d0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
e4e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e4f0: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
e500: 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  d, SQLITE_SYNC_D
e510: 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e  ATAONLY|pPager->
e520: 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
e530: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
e540: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
e550: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
e560: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
e570: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
e580: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
e590: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
e5a0: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
e5b0: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
e5c0: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
e5d0: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
e5e0: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
e5f0: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
e600: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
e610: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
e620: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
e630: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
e640: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
e650: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
e660: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
e670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
e680: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
e690: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
e6a0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
e6b0: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
e6c0: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
e6d0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
e6e0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
e6f0: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
e700: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e710: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
e720: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e730: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
e740: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
e750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
e780: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e790: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
e7a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e7b0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
e7c0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
e7d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
e7e0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
e7f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e800: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
e810: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
e820: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
e830: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
e840: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
e850: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
e860: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
e870: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
e880: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
e890: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
e8a0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
e8b0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
e8c0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
e8d0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
e8e0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
e8f0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
e900: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
e910: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
e920: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
e930: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
e940: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
e950: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
e960: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
e970: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
e980: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
e990: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
e9a0: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
e9b0: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
e9c0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
e9d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
e9e0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
e9f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
ea00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ea10: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
ea20: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ea30: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65  e */.  char *zHe
ea40: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
ea50: 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65  TmpSpace;  /* Te
ea60: 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73  mporary space us
ea70: 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64  ed to build head
ea80: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61  er */.  u32 nHea
ea90: 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65  der = (u32)pPage
eaa0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53  r->pageSize;/* S
eab0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f  ize of buffer po
eac0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61  inted to by zHea
ead0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72  der */.  u32 nWr
eae0: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb00: 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  Bytes of header 
eb10: 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a  sector written *
eb20: 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
eb50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
eb60: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
eb70: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
eb80: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
eb90: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
eba0: 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  */..  if( nHeade
ebb0: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
ebc0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
ebd0: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
ebe0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ebf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
ec00: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
ec10: 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61  savepoints and a
ec20: 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20  ny of them were 
ec30: 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69  created .  ** si
ec40: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
ec50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
ec60: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  er was written, 
ec70: 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a  update the .  **
ec80: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
ec90: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
eca0: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
ecb0: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ecc0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ecd0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
ece0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ecf0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
ed00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
ed10: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ed20: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
ed30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed40: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
ed50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ed60: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
ed70: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
ed80: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
ed90: 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  er);..  /* .  **
eda0: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
edb0: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
edc0: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
edd0: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
ede0: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
edf0: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
ee00: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
ee10: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
ee20: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
ee30: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
ee40: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
ee50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
ee60: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
ee70: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
ee80: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
ee90: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
eea0: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
eeb0: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
eec0: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
eed0: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
eee0: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
eef0: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
ef00: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
ef10: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
ef20: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
ef30: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
ef40: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
ef50: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
ef60: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
ef70: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
ef80: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
ef90: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
efa0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
efb0: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
efc0: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
efd0: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
efe0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
eff0: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
f000: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
f010: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
f020: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
f030: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
f040: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
f050: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
f060: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
f070: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
f080: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
f090: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
f0a0: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
f0b0: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
f0c0: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
f0d0: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
f0e0: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
f0f0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
f100: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
f110: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
f120: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
f130: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
f140: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
f150: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
f160: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
f170: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
f180: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
f190: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
f1a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
f1b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f1c0: 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65  noSync || (pPage
f1d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
f1e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
f1f0: 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20  E_MEMORY).   || 
f200: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
f210: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
f220: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
f230: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
f240: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
f250: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
f260: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
f270: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f280: 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32  gic));.    put32
f290: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f2a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f2b0: 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66  ic)], 0xffffffff
f2c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f2d0: 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20  memset(zHeader, 
f2e0: 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  0, sizeof(aJourn
f2f0: 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d  alMagic)+4);.  }
f300: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
f310: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
f320: 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73  tializer */ .  s
f330: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
f340: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
f350: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
f360: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f370: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
f380: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f390: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
f3a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f3b0: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
f3c0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
f3d0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
f3e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
f3f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f400: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
f410: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
f420: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
f430: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
f440: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
f450: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
f460: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f470: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
f480: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
f490: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
f4a0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
f4b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f4c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f4d0: 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+16], pPager->
f4e0: 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  pageSize);..  /*
f4f0: 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   Initializing th
f500: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75  e tail of the bu
f510: 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65  ffer is not nece
f520: 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69  ssary.  Everythi
f530: 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69  ng.  ** works fi
f540: 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd if the follow
f550: 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20  ing memset() is 
f560: 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e  omitted.  But in
f570: 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20  itializing.  ** 
f580: 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65  the memory preve
f590: 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  nts valgrind fro
f5a0: 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73  m complaining, s
f5b0: 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67  o we are willing
f5c0: 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68   to.  ** take th
f5d0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  e performance hi
f5e0: 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  t..  */.  memset
f5f0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f600: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f610: 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  20], 0,.        
f620: 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66   nHeader-(sizeof
f630: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f640: 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74  20));..  /* In t
f650: 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c  heory, it is onl
f660: 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  y necessary to w
f670: 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65  rite the 28 byte
f680: 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a  s that the .  **
f690: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f6a0: 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20  consumes to the 
f6b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
f6c0: 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e  e. Then incremen
f6d0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  t the .  ** Page
f6e0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72  r.journalOff var
f6f0: 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c  iable by JOURNAL
f700: 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20  _HDR_SZ so that 
f710: 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72  the next .  ** r
f720: 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e  ecord is written
f730: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
f740: 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e  g sector (leavin
f750: 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66  g a gap in the f
f760: 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69  ile.  ** that wi
f770: 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79  ll be implicitly
f780: 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68   filled in by th
f790: 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  e OS)..  **.  **
f7a0: 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20   However it has 
f7b0: 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20  been discovered 
f7c0: 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73  that on some sys
f7d0: 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72  tems this patter
f7e0: 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73  n can .  ** be s
f7f0: 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f  ignificantly slo
f800: 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75  wer than contigu
f810: 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61  ously writing da
f820: 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a  ta to the file,.
f830: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61    ** even if tha
f840: 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74  t means explicit
f850: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f860: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  to the block of 
f870: 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  .  ** (JOURNAL_H
f880: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
f890: 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20  s that will not 
f8a0: 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74  be used. So that
f8b0: 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73   is what.  ** is
f8c0: 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a   done. .  **.  *
f8d0: 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65  * The loop is re
f8e0: 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63  quired here in c
f8f0: 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73  ase the sector-s
f900: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
f910: 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  an the .  ** dat
f920: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
f930: 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64   Since the zHead
f940: 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c  er buffer is onl
f950: 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  y Pager.pageSize
f960: 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
f970: 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ize, more than o
f980: 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ne call to sqlit
f990: 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20  e3OsWrite() may 
f9a0: 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  be required.  **
f9b0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f9c0: 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
f9d0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
f9e0: 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74   */ .  for(nWrit
f9f0: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
fa00: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
fa10: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fa20: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
fa30: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
fa40: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
fa50: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
fa60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fa70: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
fa80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
fa90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
faa0: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
fab0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
fac0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73  nalOff);.    ass
fad0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
fae0: 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
faf0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
fb00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
fb10: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
fb20: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
fb30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
fb40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fb50: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
fb60: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
fb70: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
fb80: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
fb90: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
fba0: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
fbb0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
fbc0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
fbd0: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20  al.** file. The 
fbe0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
fbf0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
fc00: 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
fc10: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  .** pPager->jour
fc20: 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d  nalOff. See comm
fc30: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
fc40: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
fc50: 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64  Hdr() for.** a d
fc60: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
fc70: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fc80: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
fc90: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
fca0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
fcb0: 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74  y, *pNRec is set
fcc0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
fcd0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
fce0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
fcf0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62   header and *pDb
fd00: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
fd10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
fd20: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
fd30: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
fd40: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
fd50: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
fd60: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
fd70: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
fd80: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
fd90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
fda0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
fdb0: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
fdc0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
fdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fde0: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
fdf0: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
fe00: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
fe10: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
fe20: 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53  *pNRec and *PDbS
fe30: 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ize are undefine
fe40: 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  d.  If JOURNAL_H
fe50: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
fe60: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
fe70: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
fe80: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
fe90: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
fea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
feb0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
fec0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fee0: 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
fef0: 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36   int isHot,.  i6
ff00: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
ff10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ff20: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
ff30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
ff40: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
ff50: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
ff60: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
ff70: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
ff80: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
ff90: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
ffc0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
ffd0: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
ffe0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
10010 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
10020 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
10030 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
10040 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
10050 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
10060 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
10070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10080 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
10090 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
100a0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
100b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
100c0 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
100d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
100e0 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
100f0 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
10100 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
10110 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10120 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
10130 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
10140 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
10150 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
10160 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
10170 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
10180 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
10190 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
101a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
101b0 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
101c0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
101d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
101e0 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
101f0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10200 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
10210 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10220 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
10230 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10250 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
10260 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
10270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
10280 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
10290 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
102a0 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
102b0 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
102c0 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
102d0 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
102e0 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
102f0 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
10300 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
10310 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
10320 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
10330 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
10340 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69    if( isHot || i
10350 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e  HdrOff!=pPager->
10360 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20  journalHdr ){.  
10370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10380 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
10390 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
103a0 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
103b0 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  f);.    if( rc )
103c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
103d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
103e0 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
103f0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
10400 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
10410 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
10420 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10430 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
10440 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
10450 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
10460 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
10470 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
10480 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
10490 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
104a0 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
104b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
104c0 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
104d0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
104e0 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
104f0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
10500 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
10510 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
10520 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10530 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10540 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
10550 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
10560 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10570 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10580 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
10590 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
105a0 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
105b0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
105c0 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
105d0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
105e0 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
105f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10600 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
10610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
10620 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
10630 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
10640 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
10650 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
10660 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
10670 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
10680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10690 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
106a0 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
106b0 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ader */..    /* 
106c0 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69  Read the page-si
106d0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
106e0 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ze journal heade
106f0 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20  r fields. */.   
10700 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10710 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10720 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10730 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74  drOff+20, &iSect
10740 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c  orSize)).     ||
10750 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10760 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10770 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10780 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65  f+24, &iPageSize
10790 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
107a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
107b0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e  ..    /* Version
107c0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
107d0 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74  r to 3.5.8 set t
107e0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65  he page-size fie
107f0 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ld of the.    **
10800 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10810 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
10820 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68   case, assume th
10830 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67  at the Pager.pag
10840 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72  eSize.    ** var
10850 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79  iable is already
10860 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72   set to the corr
10870 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20  ect page size.. 
10880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10890 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ageSize==0 ){.  
108a0 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20      iPageSize = 
108b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
108c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
108d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  Check that the v
108e0 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20  alues read from 
108f0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
10900 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  d sector-size fi
10910 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  elds.    ** are 
10920 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f  within range. To
10930 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20   be 'in range', 
10940 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64  both values need
10950 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20   to be a power. 
10960 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65     ** of two gre
10970 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
10980 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c  al to 512 or 32,
10990 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72   and not greater
109a0 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20   than their .   
109b0 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63   ** respective c
109c0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69  ompile time maxi
109d0 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20  mum limits..    
109e0 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
109f0 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20  Size<512        
10a00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65            || iSe
10a10 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20  ctorSize<32.    
10a20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
10a30 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
10a40 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
10a50 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
10a60 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
10a70 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
10a80 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
10a90 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
10aa0 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
10ab0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
10ac0 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
10ad0 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
10ae0 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
10af0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
10b00 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
10b10 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
10b20 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
10b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
10b40 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
10b50 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
10b60 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
10b70 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
10b80 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
10b90 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
10ba0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
10bb0 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
10bc0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
10bd0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
10be0 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
10bf0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
10c00 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
10c10 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10c20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
10c30 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
10c40 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
10c50 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
10c60 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
10c70 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
10c80 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
10c90 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
10ca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10cb0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
10cc0 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
10cd0 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
10ce0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
10cf0 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  OK );..    /* Up
10d00 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
10d10 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
10d20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
10d30 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20  used by .    ** 
10d40 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
10d50 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
10d60 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
10d70 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a  ournal was.    *
10d80 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
10d90 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
10da0 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
10db0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
10dc0 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
10dd0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
10de0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
10df0 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
10e00 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67  ue.    ** of Pag
10e10 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
10e20 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
10e30 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
10e40 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tine..    */.   
10e50 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
10e60 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  ize = iSectorSiz
10e70 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  e;.  }..  pPager
10e80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
10e90 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10ea0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
10eb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
10ec0 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
10ed0 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
10ee0 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
10ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10f00 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
10f10 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
10f20 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
10f30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10f40 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
10f50 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
10f60 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
10f70 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
10f80 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
10f90 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
10fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10fb0 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
10fc0 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
10fd0 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
10fe0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
10ff0 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
11000 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
11010 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
11020 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
11030 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20  **   + N bytes: 
11040 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  Master journal f
11050 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38  ilename in utf-8
11060 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
11070 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d  : N (length of m
11080 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11090 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20  me in bytes, no 
110a0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e  nul-terminator).
110b0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
110c0 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
110d0 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
110e0 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61  *   + 8 bytes: a
110f0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
11100 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
11110 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
11120 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
11130 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
11140 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
11150 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68  journal name, wh
11160 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73  ere each byte is
11170 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
11180 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69  a signed 8-bit i
11190 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  nteger..**.** If
111a0 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
111b0 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
111c0 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
111d0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
111e0 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
111f0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
11200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11210 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
11220 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
11230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11240 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
11270 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
11280 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20  t nMaster;      
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112a0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
112b0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  ng zMaster */.  
112c0 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
112f0 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  ader in journal 
11300 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72  file */.  i64 jr
11310 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  nlSize;         
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11330 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ze of journal fi
11340 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20  le on disk */.  
11350 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20  u32 cksum = 0;  
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20   /* Checksum of 
11380 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
11390 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
113a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
113b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
113c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
113d0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a  er) );..  if( !z
113e0 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50  Master .   || pP
113f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
11400 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
11410 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
11420 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
11430 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20  r->jfd).  ){.   
11440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11450 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
11460 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
11470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11480 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
11490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
114a0 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  ff );..  /* Calc
114b0 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68  ulate the length
114c0 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68   in bytes and th
114d0 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d  e checksum of zM
114e0 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e  aster */.  for(n
114f0 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65  Master=0; zMaste
11500 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73  r[nMaster]; nMas
11510 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ter++){.    cksu
11520 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  m += zMaster[nMa
11530 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster];.  }..  /*
11540 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
11550 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
11560 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
11570 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
11580 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
11590 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
115a0 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
115b0 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
115c0 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
115d0 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
115e0 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
115f0 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
11600 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
11610 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
11620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11630 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
11640 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
11650 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
11660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
11670 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
11680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11690 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20  data to the end 
116a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
116b0 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ile. If.  ** an 
116c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
116d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
116e0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
116f0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30  r..  */.  if( (0
11700 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11710 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11720 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45  d, iHdrOff, PAGE
11730 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
11740 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  )))).   || (0 !=
11750 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11760 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
11770 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73  d, zMaster, nMas
11780 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29  ter, iHdrOff+4))
11790 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
117a0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
117b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
117c0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20  rOff+4+nMaster, 
117d0 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c  nMaster))).   ||
117e0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
117f0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11800 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
11810 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d  nMaster+4, cksum
11820 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11830 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11840 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11850 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
11860 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   8,.            
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e       iHdrOff+4+n
11890 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
118a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
118b0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
118c0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
118d0 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20  ster+20);..  /* 
118e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118f0 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
11900 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
11910 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
11920 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
11930 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
11940 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
11950 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
11960 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
11970 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
11980 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
11990 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
119a0 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
119b0 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
119c0 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
119d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
119e0 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
119f0 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
11a00 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
11a10 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
11a20 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
11a30 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
11a40 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
11a50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
11a60 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
11a70 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
11a80 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
11a90 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
11aa0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
11ab0 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
11ac0 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
11ad0 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
11ae0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11af0 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
11b00 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
11b10 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
11b20 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
11b30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11b40 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
11b50 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11b60 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
11b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11b80 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e  * Discard the en
11b90 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11ba0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
11bb0 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  age-cache..*/.st
11bc0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11bd0 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
11be0 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ger){.  pPager->
11bf0 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a  iDataVersion++;.
11c00 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
11c10 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
11c20 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74  Backup);.  sqlit
11c30 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
11c40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
11c50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c60 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74  the pPager->iDat
11c70 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a  aVersion value.*
11c80 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67  /.u32 sqlite3Pag
11c90 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61  erDataVersion(Pa
11ca0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11cb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11cc0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
11cd0 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  N );.  return pP
11ce0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11cf0 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  on;.}../*.** Fre
11d00 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  e all structures
11d10 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
11d20 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
11d30 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a   and set both.**
11d40 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11d50 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76  t and Pager.nSav
11d60 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20  epoint to zero. 
11d70 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f  Close the sub-jo
11d80 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69  urnal.** if it i
11d90 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
11da0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
11db0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
11dc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
11dd0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11de0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
11df0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
11e10 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69  erator for loopi
11e20 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72  ng through Pager
11e30 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  .aSavepoint */. 
11e40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
11e50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11e60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ; ii++){.    sql
11e70 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
11e80 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
11e90 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
11ea0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  point);.  }.  if
11eb0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11ec0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69  siveMode || sqli
11ed0 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
11ee0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66  mory(pPager->sjf
11ef0 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
11f00 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
11f10 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
11f20 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
11f30 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
11f40 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
11f50 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11f60 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
11f70 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11f80 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
11f90 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
11fa0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
11fb0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
11fc0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
11fd0 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
11fe0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
11ff0 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
12000 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
12010 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
12020 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
12030 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
12040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
12050 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
12060 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
12070 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
12080 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
12090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
120a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
120b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
120c0 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
120d0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
120e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
120f0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
12100 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
12110 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
12120 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
12130 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
12140 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
12150 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
12160 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
12170 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
12180 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
12190 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
121a0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
121b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
121c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
121d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
121e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
121f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
12200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12210 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
12220 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
12230 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
12240 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
12250 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
12260 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
12270 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
12280 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
12290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
122a0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
122b0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
122c0 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
122d0 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
122e0 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
122f0 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
12300 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
12310 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
12320 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
12330 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
12340 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
12350 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
12360 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
12370 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
12380 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
12390 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
123a0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
123b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
123c0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
123d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
123e0 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
123f0 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
12400 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
12410 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
12420 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
12430 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
12440 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
12450 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
12460 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
12470 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
12480 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12490 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
124a0 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
124b0 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
124c0 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
124d0 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
124e0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
124f0 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
12500 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
12510 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
12520 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
12530 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
12540 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
12550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12560 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
12570 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
12580 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
12590 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
125a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
125b0 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
125c0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
125d0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
125e0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
125f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
12600 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
12610 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
12620 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
12630 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
12640 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
12650 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
12660 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
12670 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
12680 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
12690 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
126a0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
126b0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
126c0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
126d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
126e0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
12710 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
12720 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
12730 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
12740 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
12750 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
12760 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
12770 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
12780 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
12790 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
127a0 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
127b0 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
127c0 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
127d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
127e0 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
127f0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
12800 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
12810 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
12820 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
12830 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
12840 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
12850 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
12860 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
12870 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12880 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12890 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
128a0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
128b0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
128c0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
128d0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
128e0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
128f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
12900 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12910 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12920 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
12930 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
12940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12950 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12960 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
12970 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12980 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12990 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
129a0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
129b0 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
129c0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
129d0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
129e0 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
129f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
12a00 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
12a10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12a20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
12a30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
12a40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12a50 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12a60 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
12a70 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
12a80 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
12a90 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
12aa0 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
12ab0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
12ac0 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
12ad0 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
12ae0 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
12af0 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
12b00 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
12b10 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
12b20 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
12b30 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
12b40 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
12b50 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
12b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b70 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
12b80 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
12b90 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12ba0 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
12bb0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
12bc0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
12bd0 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
12be0 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
12bf0 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
12c00 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
12c10 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
12c20 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
12c30 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
12c40 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12c50 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12c60 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12c70 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12c80 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
12c90 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12ca0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12cb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12cc0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
12cd0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12ce0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12cf0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12d00 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12d10 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12d20 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12d30 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12d40 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12d50 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12d60 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12d70 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12d80 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12d90 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
12da0 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
12db0 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
12dc0 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
12dd0 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
12de0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12df0 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12e00 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12e10 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12e20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12e30 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
12e40 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
12e50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12e60 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
12e70 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
12e80 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  le==0 ){.      p
12e90 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12ea0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
12eb0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12ec0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  e = 0;.      pPa
12ed0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12ee0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  GER_OPEN;.    }e
12ef0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
12f00 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f  r->eState = (isO
12f10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
12f20 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20   ? PAGER_OPEN : 
12f30 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20  PAGER_READER);. 
12f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45     }.    if( USE
12f50 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
12f60 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
12f70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
12f80 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  0);.    pPager->
12f90 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12fa0 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74 74  _OK;.    setGett
12fb0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
12fc0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12fd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12fe0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12ff0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
13000 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
13010 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
13020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13030 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
13040 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
13050 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
13060 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
13070 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
13080 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
13090 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
130a0 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
130b0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
130c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
130d0 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
130e0 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
130f0 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
13100 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
13110 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
13120 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
13130 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
13140 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
13150 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13160 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
13170 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
13180 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13190 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
131a0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
131b0 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
131c0 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
131d0 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
131e0 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
131f0 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
13200 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
13210 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
13220 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
13230 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
13240 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
13250 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
13260 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
13270 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
13280 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
13290 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
132a0 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
132b0 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
132c0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
132d0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
132e0 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
132f0 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
13300 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
13310 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
13320 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
13330 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13340 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
13350 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
13360 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
13370 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
13380 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
13390 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
133a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
133b0 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
133c0 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
133d0 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
133e0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
133f0 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
13400 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
13410 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
13420 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
13430 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
13440 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
13450 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
13460 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
13470 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
13480 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
13490 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
134a0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
134b0 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
134c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
134d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
134e0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
134f0 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
13500 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
13510 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
13520 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
13530 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
13540 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13550 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
13560 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13570 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  GER_ERROR;.    s
13580 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
13590 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
135a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
135b0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
135c0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
135d0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
135e0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69  ;../*.** The wri
135f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
13600 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73  pen on pPager is
13610 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
13620 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a   (bCommit==1).**
13630 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
13640 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a  (bCommit==0)..**
13650 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13660 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
13670 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73  ll dirty pages s
13680 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
13690 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
136a0 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  Rules:.**.**   *
136b0 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64    For non-TEMP d
136c0 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73  atabases, always
136d0 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20   sync to disk.  
136e0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
136f0 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72  y.**      for tr
13700 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65  ansactions to be
13710 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20   durable..**.** 
13720 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64    *  Sync TEMP d
13730 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20  atabase only on 
13740 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20  a COMMIT (not a 
13750 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74  ROLLBACK) when t
13760 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20  he backing.**   
13770 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e     file has been
13780 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64 79   created already
13790 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e   (via a spill on
137a0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29 20   pagerStress()) 
137b0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e  and.**      when
137c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
137d0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65  irty pages in me
137e0 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35 25  mory exceeds 25%
137f0 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a   of the total.**
13800 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a 65        cache size
13810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13820 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
13830 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
13840 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
13850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
13860 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  mpFile==0 ) retu
13870 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f  rn 1;.  if( !bCo
13880 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  mmit ) return 0;
13890 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
138a0 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
138b0 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
138c0 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65  (sqlite3PCachePe
138d0 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65  rcentDirty(pPage
138e0 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29  r->pPCache)>=25)
138f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13900 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
13910 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
13920 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
13930 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
13940 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
13950 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
13960 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
13970 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
13980 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
13990 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
139a0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
139b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
139c0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
139d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
139e0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
139f0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
13a00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
13a10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
13a20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
13a30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13a40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
13a50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
13a60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
13a70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
13a80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
13a90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
13aa0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
13ab0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
13ac0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
13ad0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
13ae0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
13af0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
13b00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
13b10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
13b20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
13b30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
13b40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
13b50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
13b60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
13b70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
13b80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
13b90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
13ba0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
13bb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
13bc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
13bd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
13be0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
13bf0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
13c00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
13c10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
13c20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
13c30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
13c40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
13c50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
13c60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
13c70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13c80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
13c90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
13ca0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
13cb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
13cc0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
13cd0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
13ce0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
13cf0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
13d00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
13d10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
13d20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
13d30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
13d40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13d50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
13d60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
13d70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
13d80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
13d90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
13da0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
13db0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
13dc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
13dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13de0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13df0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13e00 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13e10 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13e20 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13e30 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13e40 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13e50 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13e70 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13e80 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13e90 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
13ea0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
13eb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
13ec0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
13ed0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13ee0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13ef0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13f00 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13f10 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13f20 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13f30 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13f40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13f50 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13f60 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13f70 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13f80 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13f90 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
13fa0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
13fb0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
13fc0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
13fd0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13fe0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13ff0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
14000 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
14010 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
14020 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
14030 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
14040 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
14050 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
14060 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
14070 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
14080 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
14090 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
140a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
140b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
140c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
140d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
140e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
140f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
14100 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
14110 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
14120 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
14130 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
14140 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
14150 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
14160 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
14170 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
14180 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
14190 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
141a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
141b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
141c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
141d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
141e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
141f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
14200 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
14210 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
14220 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
14230 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
14240 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
14250 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
14260 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
14270 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
14280 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
14290 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
142a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
142b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
142c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
142d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
142e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
142f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14300 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
14310 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
14320 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
14330 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
14340 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
14350 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
14360 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
14370 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
14380 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
14390 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
143a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
143b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
143c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
143d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
143e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
143f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
14400 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
14410 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
14420 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
14430 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
14440 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
14450 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
14460 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
14470 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
14480 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
14490 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
144a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
144b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
144c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
144d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
144e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
144f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
14500 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
14510 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
14520 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
14530 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
14540 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
14550 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
14560 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
14570 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
14580 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
14590 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
145a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
145b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
145c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
145d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
145e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
145f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
14600 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14610 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
14620 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
14630 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
14640 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14650 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
14670 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14680 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
14690 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
146a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
146b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
146c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
146d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
146e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
146f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
14700 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
14710 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
14720 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14730 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
14740 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20 20 20  urnal==0 .      
14750 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
14760 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
14770 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
14780 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
14790 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b 0a 20  H_ATOMIC).  );. 
147a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
147b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
147c0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
147d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
147e0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
147f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14800 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
14810 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
14820 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
14830 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fd) ){.      /* 
14840 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14850 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14860 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14870 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20  EMORY ); */.    
14880 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14890 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
148a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
148b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
148c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
148d0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
148e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
148f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
14900 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14930 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
14940 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
14950 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
14960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14970 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c  K && pPager->ful
14980 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
14990 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
149a0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a  the new file siz
149b0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
149c0 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68  o the inode righ
149d0 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20  t away..        
149e0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74    ** Otherwise t
149f0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
14a00 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f   resurrect follo
14a10 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73  wing a power los
14a20 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
14a30 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61 73  ** cause the las
14a40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  t transaction to
14a50 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65   roll back.  See
14a60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74  .          ** ht
14a70 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d  tps://bugzilla.m
14a80 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f  ozilla.org/show_
14a90 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37  bug.cgi?id=10727
14aa0 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  73.          */.
14ab0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
14ac0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
14ad0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
14ae0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
14af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14b00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14b10 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14b20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
14b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14b40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14b50 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
14b60 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
14b70 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
14b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14b90 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
14ba0 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
14bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
14bc0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14bd0 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50  r, hasMaster||pP
14be0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
14bf0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14c00 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
14c30 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
14c40 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
14c50 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
14c60 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
14c70 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
14c80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
14c90 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
14ca0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
14cb0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
14cc0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
14cd0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
14ce0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
14cf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
14d00 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
14d10 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
14d20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
14d30 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
14d40 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14d50 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70   = !pPager->temp
14d60 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  File;.      asse
14d70 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  rt( sqlite3Journ
14d80 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14d90 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a  ger->jfd)==0 );.
14da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14db0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14dc0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14dd0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
14de0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
14df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14e00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14e10 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
14e20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14e30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14e40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14e50 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
14e60 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
14e70 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
14e80 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74        if( bDelet
14e90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
14ea0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
14eb0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
14ec0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
14ed0 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  , pPager->extraS
14ee0 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
14ef0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14f00 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
14f10 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ES.  sqlite3Pcac
14f20 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
14f30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14f40 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
14f50 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  sh);.  if( pPage
14f60 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20  r->dbSize==0 && 
14f70 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
14f80 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
14f90 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
14fa0 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74  PgHdr *p = sqlit
14fb0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
14fc0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
14fd0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
14fe0 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
14ff0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15000 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b  UnrefNotNull(p);
15010 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15020 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
15030 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
15040 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
15050 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
15060 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
15070 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
15080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15090 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   ){.    if( MEMD
150a0 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f  B || pagerFlushO
150b0 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20  nCommit(pPager, 
150c0 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  bCommit) ){.    
150d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
150e0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
150f0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65  pPCache);.    }e
15100 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
15110 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69  e3PcacheClearWri
15120 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50  table(pPager->pP
15130 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Cache);.    }.  
15140 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
15150 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
15160 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
15170 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
15180 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
15190 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
151a0 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
151b0 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
151c0 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
151d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
151e0 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
151f0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
15200 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
15210 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
15220 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
15230 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
15240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15250 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
15260 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
15270 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
15280 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
15290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
152a0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
152b0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
152c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
152d0 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
152e0 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
152f0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
15300 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
15310 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
15320 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
15330 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
15340 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
15350 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
15360 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
15370 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
15380 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
15390 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
153a0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
153b0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
153c0 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
153d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
153e0 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
153f0 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
15400 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
15410 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
15420 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
15430 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
15440 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
15450 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
15460 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
15470 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
15480 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
15490 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
154a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
154b0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
154c0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
154d0 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
154e0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
154f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15500 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
15510 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
15520 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
15530 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15540 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
15550 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
15560 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
15570 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15580 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
15590 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
155a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
155b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
155c0 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
155d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
155e0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
155f0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
15600 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
15610 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
15620 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
15630 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
15640 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
15650 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
15660 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15670 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
15680 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
15690 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
156a0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
156b0 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
156c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
156d0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
156e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
156f0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
15700 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
15710 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
15720 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15730 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
15740 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
15750 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
15760 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
15770 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
15780 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
15790 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
157a0 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
157b0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
157c0 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
157d0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
157e0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
157f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15800 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
15810 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
15820 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
15830 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
15840 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
15850 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
15860 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
15870 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
15880 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
15890 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
158a0 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
158b0 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
158c0 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
158d0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
158e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
158f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
15900 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
15910 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
15920 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
15930 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15940 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
15950 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
15960 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
15970 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
15980 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15990 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
159a0 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
159b0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
159c0 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
159d0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
159e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
159f0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15a00 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15a10 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15a20 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15a30 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
15a40 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
15a50 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
15a60 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
15a70 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
15a80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15a90 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15aa0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
15ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
15ac0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
15ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
15ae0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
15af0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
15b00 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15b10 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
15b20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15b30 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
15b40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15b50 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15b60 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
15b70 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
15b80 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
15b90 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
15ba0 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
15bb0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
15bc0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
15bd0 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
15be0 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
15bf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
15c00 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
15c10 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
15c20 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
15c30 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
15c40 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
15c50 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
15c60 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15c70 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
15c80 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
15c90 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
15ca0 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
15cb0 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
15cc0 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
15cd0 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
15ce0 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
15cf0 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
15d00 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
15d10 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
15d20 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
15d30 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
15d40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
15d50 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
15d60 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
15d70 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15d80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15d90 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15da0 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15db0 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15dc0 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15dd0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15de0 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15df0 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15e00 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15e10 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
15e20 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
15e30 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
15e40 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
15e50 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
15e60 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
15e70 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15e80 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15e90 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15ea0 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15eb0 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15ed0 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15ee0 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15ef0 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15f00 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15f10 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
15f20 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
15f30 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
15f40 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
15f50 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
15f60 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
15f70 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15f80 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15f90 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15fa0 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15fb0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15fc0 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15fd0 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15fe0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15ff0 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
16000 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
16010 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
16020 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
16030 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
16040 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
16050 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
16060 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
16070 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
16080 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
16090 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
160a0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
160b0 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
160c0 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
160d0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
160e0 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
160f0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
16100 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16110 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
16120 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
16130 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
16140 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
16150 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
16160 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
16190 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
161a0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
161b0 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
161c0 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
161d0 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
161e0 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
161f0 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
16200 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16210 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
16220 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
16230 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16240 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
16250 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
16260 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
16270 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
16280 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
16290 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
162a0 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
162b0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
162c0 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
162d0 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
162e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
162f0 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
16300 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
16310 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
16320 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16330 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
16340 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
16350 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
16360 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
16370 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
16380 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
16390 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
163a0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
163b0 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
163c0 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
163d0 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
163e0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
163f0 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
16400 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
16410 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
16420 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
16430 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
16440 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
16450 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
16460 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
16470 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
16480 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
16490 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
164a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
164b0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
164c0 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
164d0 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
164e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
164f0 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
16500 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
16510 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
16520 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
16530 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16540 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
16550 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
16560 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
16570 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
16580 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
16590 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
165a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
165b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
165c0 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
165d0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
165e0 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
165f0 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
16600 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
16610 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
16620 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
16630 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16640 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
16650 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
16660 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
16670 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
16680 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
16690 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
166a0 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
166b0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
166c0 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
166d0 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
166e0 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
166f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
16700 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
16710 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
16720 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16730 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
16740 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
16750 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16760 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
16770 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
16780 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
16790 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
167a0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
167b0 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
167c0 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
167d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
167e0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
167f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16800 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
16810 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16820 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16830 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
16840 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
16850 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
16860 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
16870 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
16880 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
16890 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
168a0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
168b0 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
168c0 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
168d0 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
168e0 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
168f0 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
16900 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
16910 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
16920 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16930 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
16940 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
16950 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
16960 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
16970 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
16980 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
16990 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
169a0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
169b0 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
169c0 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
169d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
169e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
169f0 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
16a00 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
16a10 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16a20 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
16a30 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
16a40 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
16a50 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
16a60 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
16a70 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
16a80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16a90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
16aa0 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
16ab0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
16ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ad0 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
16ae0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
16af0 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
16b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16b10 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
16b20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
16b30 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b50 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
16b60 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
16b70 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
16b80 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
16b90 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
16ba0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
16bb0 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
16bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
16bd0 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
16be0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16bf0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16c00 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
16c10 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
16c20 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16c30 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
16c40 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
16c50 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
16c60 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
16c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16c80 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
16c90 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
16ca0 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16cd0 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
16ce0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
16cf0 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
16d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d10 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
16d20 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
16d30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16d40 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
16d50 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
16d60 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
16d70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16d80 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16db0 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16dc0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
16dd0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f  TE_HAS_CODEC.  /
16de0 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c  * The jrnlEnc fl
16df0 61 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f  ag is true if Jo
16e00 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75  urnal pages shou
16e10 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72  ld be passed thr
16e20 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ough.  ** the co
16e30 64 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73  dec.  It is fals
16e40 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65  e for pure in-me
16e50 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  mory journals. *
16e60 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72  /.  const int jr
16e70 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a  nlEnc = (isMainJ
16e80 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  rnl || pPager->s
16e90 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b  ubjInMemory==0);
16ea0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
16eb0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16ec0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16ed0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16ee0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16ef0 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16f00 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16f10 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16f20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16f30 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
16f40 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
16f50 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
16f60 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
16f70 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
16f80 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
16f90 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
16fa0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
16fb0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
16fc0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
16fd0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
16fe0 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16ff0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
17000 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
17010 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
17020 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
17030 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
17040 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
17050 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
17060 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
17070 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
17080 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
17090 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
170a0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
170b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
170c0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
170d0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
170e0 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
170f0 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
17100 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
17110 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17120 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
17130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17140 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
17150 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
17160 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
17170 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17180 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
17190 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
171a0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
171b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
171c0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
171d0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
171e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
171f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
17200 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
17210 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
17220 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
17230 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
17240 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
17250 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
17260 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17270 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
17280 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
17290 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
172a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
172b0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
172c0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
172d0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
172e0 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
172f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
17300 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
17310 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
17320 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
17330 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
17340 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
17350 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
17360 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17370 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
17380 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17390 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
173a0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
173b0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
173c0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
173d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
173e0 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
173f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
17410 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
17420 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
17430 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
17440 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
17450 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
17460 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
17470 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
17480 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
17490 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
174a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
174b0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
174c0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
174d0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
174e0 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
174f0 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
17500 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
17510 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
17520 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
17530 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
17540 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
17550 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
17560 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
17570 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
17580 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
17590 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
175a0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
175b0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
175c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
175d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
175e0 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
175f0 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
17600 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
17610 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
17620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17630 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
17640 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
17650 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
17660 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
17670 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
17680 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17690 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
176a0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
176b0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
176c0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
176d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
176e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
176f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17700 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
17710 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
17720 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
17730 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
17740 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
17750 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
17760 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
17770 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
17780 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
17790 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
177a0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
177b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
177c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
177d0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
177e0 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
177f0 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
17800 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
17810 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
17820 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
17830 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
17840 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
17850 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
17860 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
17870 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
17880 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
17890 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
178a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
178b0 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
178c0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
178d0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
178e0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
178f0 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
17900 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
17910 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
17920 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
17930 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17940 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
17950 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
17960 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17970 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
17980 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
17990 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
179a0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
179b0 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
179c0 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
179d0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
179e0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
179f0 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17a00 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
17a10 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17a20 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
17a30 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
17a40 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
17a50 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
17a60 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
17a70 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
17a80 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
17a90 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
17aa0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
17ab0 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
17ac0 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
17ad0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17ae0 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17af0 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17b00 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
17b10 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
17b20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
17b30 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
17b40 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
17b50 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
17b60 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
17b70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
17b80 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
17b90 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
17ba0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
17bb0 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
17bc0 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
17bd0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17be0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17bf0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17c00 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17c10 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17c20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17c30 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17c40 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17c50 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17c60 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17c70 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17c80 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
17c90 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
17ca0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
17cb0 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
17cc0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17cd0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17ce0 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17cf0 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17d00 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17d10 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17d20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17d30 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17d40 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17d50 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17d60 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17d70 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17d80 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
17d90 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17da0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17db0 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17dc0 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17dd0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17de0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17df0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17e00 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17e10 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17e20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17e30 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17e40 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17e50 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17e60 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17e70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17e80 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
17e90 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
17ea0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17eb0 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17ec0 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17ed0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17ee0 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17ef0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17f00 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17f10 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17f20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17f30 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17f40 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17f50 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
17f60 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
17f70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
17f80 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
17f90 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
17fa0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
17fb0 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
17fc0 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
17fd0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
17fe0 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17ff0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
18000 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
18010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
18020 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
18030 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
18040 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
18050 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
18060 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
18070 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
18080 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
18090 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
180a0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
180b0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
180c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
180d0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
180e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
180f0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
18100 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
18110 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
18120 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
18130 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
18140 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
18150 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
18160 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  g==0 || pPager->
18170 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41  tempFile );.  PA
18180 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
18190 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
181a0 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
181b0 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
181c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
181d0 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
181e0 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
181f0 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
18200 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
18210 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
18220 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
18230 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
18240 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
18250 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
18260 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
18270 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
18280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18290 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
182a0 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
182b0 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
182c0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
182d0 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
182e0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
182f0 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
18300 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
18310 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
18320 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
18330 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
18340 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
18350 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
18360 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
18370 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
18380 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
18390 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
183a0 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
183b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
183c0 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
183d0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
183e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
183f0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
18400 65 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d  e data read from
18410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
18420 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18430 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
18440 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
18450 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61   safe even for a
18460 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
18470 62 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61  base - as the da
18480 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  ta.    ** was en
18490 63 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69  crypted before i
184a0 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  t was written to
184b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
184c0 65 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  e. The exception
184d0 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68  .    ** is if th
184e0 65 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20  e data was just 
184f0 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d  read from an in-
18500 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
18510 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20  al. In that.    
18520 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20  ** case it must 
18530 62 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72  be encrypted her
18540 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63  e before it is c
18550 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64  opied into the d
18560 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
18570 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20  ile.  */.#ifdef 
18580 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18590 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e  .    if( !jrnlEn
185a0 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  c ){.      CODEC
185b0 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
185c0 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
185d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
185e0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63  aData);.      rc
185f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18600 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18610 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18620 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18630 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  t);.      CODEC1
18640 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18650 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
18660 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
18670 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
18680 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18690 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
186a0 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
186b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
186c0 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20  ze, ofst);..    
186d0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
186e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
186f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
18700 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
18710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18720 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
18730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18740 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69  AS_CODEC.      i
18750 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  f( jrnlEnc ){.  
18760 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18770 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18780 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18790 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
187a0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
187b0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
187c0 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
187d0 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
187e0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
187f0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18800 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18810 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a  EM_BKPT,aData);.
18820 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
18830 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
18840 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
18850 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
18860 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
18870 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18880 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
18890 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
188a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
188b0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
188c0 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
188d0 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
188e0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
188f0 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
18900 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
18910 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
18920 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
18930 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
18940 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
18950 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
18960 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
18970 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
18980 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
18990 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
189a0 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
189b0 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
189c0 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
189d0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
189e0 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
189f0 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
18a00 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
18a10 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
18a20 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
18a30 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
18a40 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
18a50 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
18a60 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
18a70 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
18a80 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
18a90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18aa0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
18ab0 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
18ac0 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
18ad0 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
18ae0 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
18af0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
18b00 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
18b10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
18b20 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
18b30 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
18b40 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
18b50 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
18b60 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
18b70 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
18b80 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
18b90 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
18ba0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
18bb0 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
18bc0 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
18bd0 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
18be0 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
18bf0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
18c00 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18c10 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
18c20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
18c30 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18c40 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
18c50 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  BACK)==0 );.    
18c60 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18c70 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
18c80 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63  ROLLBACK;.    rc
18c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18ca0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
18cb0 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
18cc0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18cd0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18ce0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18cf0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
18d00 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
18d10 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
18d20 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
18d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
18d40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
18d50 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
18d60 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
18d70 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
18d80 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
18d90 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
18da0 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
18db0 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
18dc0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
18dd0 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
18de0 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
18df0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
18e00 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
18e10 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
18e20 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
18e30 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
18e40 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
18e50 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
18e60 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
18e70 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18e80 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18e90 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18ea0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18eb0 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18ec0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18ed0 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18ee0 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18ef0 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18f00 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18f10 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
18f20 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
18f30 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73  g);.    /* It us
18f40 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71  ed to be that sq
18f50 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
18f60 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61  lean(pPg) was ca
18f70 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a  lled here.  But.
18f80 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c      ** that call
18f90 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61   was dangerous a
18fa0 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74  nd had no detect
18fb0 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e  able benefit sin
18fc0 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20  ce the cache.   
18fd0 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   ** is normally 
18fe0 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74  cleaned by sqlit
18ff0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
19000 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  () after rollbac
19010 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20  k and so.    ** 
19020 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
19030 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73  . */.    pager_s
19040 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
19050 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
19060 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
19070 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
19080 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
19090 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
190a0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
190b0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
190c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
190d0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
190e0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
190f0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
19100 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
19110 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
19120 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
19130 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
19140 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
19150 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51  m disk */.#if SQ
19160 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19170 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29     if( jrnlEnc )
19180 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c  { CODEC1(pPager,
19190 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
191a0 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
191b0 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23  NOMEM_BKPT); }.#
191c0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
191d0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
191e0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
191f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
19200 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
19210 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
19220 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
19230 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
19240 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
19250 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
19260 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19270 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
19280 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
19290 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
192a0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
192b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
192c0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
192d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
192e0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
192f0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
19300 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
19310 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
19320 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
19330 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
19340 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
19350 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
19360 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19370 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
19380 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19390 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
193a0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
193b0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
193c0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
193d0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
193e0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
193f0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
19400 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
19410 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
19420 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19430 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
19440 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
19450 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
19460 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
19470 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
19480 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
19490 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
194a0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
194b0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
194c0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
194d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
194e0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
194f0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
19500 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
19510 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
19520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19530 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
19540 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
19550 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
19560 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
19570 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
19580 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19590 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
195a0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
195b0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
195c0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
195d0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
195e0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
195f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
19600 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
19610 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
19620 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
19630 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
19640 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
19650 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
19660 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
19670 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
19680 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
19690 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
196a0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
196b0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
196c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
196d0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
196e0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
196f0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
19700 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
19710 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
19720 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
19730 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
19740 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
19750 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
19760 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
19770 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
19780 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
19790 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
197a0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
197b0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
197c0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
197d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
197e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
197f0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
19800 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
19810 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
19820 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
19830 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
19840 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
19850 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
19860 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19870 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
19880 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
19890 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
198a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
198b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
198c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
198d0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
198e0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
198f0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
19900 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
19910 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
19920 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
19930 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
19940 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
19950 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
19960 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
19970 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
19980 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
19990 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
199a0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
199b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
199c0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
199d0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
199e0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
199f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19a00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19a10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
19a20 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
19a30 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
19a40 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
19a50 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19a60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
19a70 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
19a80 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
19a90 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
19aa0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
19ab0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
19ac0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
19ad0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
19ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19af0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
19b00 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
19b10 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
19b20 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
19b30 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
19b40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19b50 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
19b60 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
19b70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
19b80 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19b90 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
19ba0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
19bb0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
19bc0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
19bd0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
19be0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
19bf0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
19c00 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
19c10 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19c20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
19c30 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
19c40 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
19c50 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
19c60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
19c70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
19c80 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
19c90 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
19ca0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
19cb0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
19cc0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
19cd0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
19ce0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
19cf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
19d00 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
19d10 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
19d20 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
19d30 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19d40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
19d60 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23  t int flags = .#
19d70 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
19d80 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
19d90 0a 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e  .      (pPager->
19da0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
19db0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
19dc0 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
19dd0 66 0a 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f  f.      (SQLITE_
19de0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
19df0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
19e00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
19e10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19e20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
19e30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
19e40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
19e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19e60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19e70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
19e80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
19e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
19ea0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
19eb0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
19ec0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
19ed0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
19ee0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
19ef0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
19f00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
19f10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
19f20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
19f30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
19f40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
19f50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
19f60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
19f70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
19f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19f90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
19fa0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
19fb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
19fc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
19fd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19fe0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
19ff0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1a000 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
1a010 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
1a020 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
1a030 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20   + nMasterPtr + 
1a040 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  1);.  if( !zMast
1a050 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
1a060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a070 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  EM_BKPT;.    got
1a080 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a090 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
1a0a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
1a0b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
1a0c0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
1a0d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
1a0e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
1a0f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
1a100 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
1a110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a120 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
1a130 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
1a140 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a150 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
1a160 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
1a170 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
1a180 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
1a190 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
1a1a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
1a1b0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
1a1c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a1d0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1a1e0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1a1f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1a200 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
1a210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a220 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
1a230 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
1a240 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
1a250 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
1a260 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a270 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
1a280 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a290 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
1a2a0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
1a2b0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
1a2c0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
1a2d0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
1a2e0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
1a2f0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
1a300 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
1a310 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
1a320 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
1a330 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
1a340 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
1a350 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1a360 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 28 70  CTION.        (p
1a370 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
1a380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
1a390 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
1a3a0 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
1a3b0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a3c0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a3d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a3e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a3f0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a400 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a410 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a440 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a450 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a460 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a470 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a480 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a490 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a4b0 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a4c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a4e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a4f0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a500 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a510 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a520 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a530 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a540 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a550 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a560 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a570 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a580 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a590 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a5a0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a5b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a5c0 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a5d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a5e0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a5f0 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a600 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a610 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a620 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a630 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a640 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a650 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a660 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a670 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a680 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a690 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a6a0 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a6b0 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a6c0 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a6d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a6e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a6f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a700 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a710 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a720 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a730 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a740 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a750 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a760 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a770 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a780 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a790 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a7a0 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a7b0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a7c0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a7d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a7e0 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a7f0 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a800 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a810 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a820 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a830 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a840 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a850 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a860 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a870 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a880 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a890 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a8a0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a8b0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a8c0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a8d0 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a8e0 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a8f0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a900 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a910 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a920 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1a930 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1a940 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1a950 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1a960 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1a970 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1a980 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1a990 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1a9a0 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1a9b0 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1a9c0 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1a9d0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1a9e0 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1a9f0 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1aa00 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1aa10 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1aa20 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1aa30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1aa40 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1aa50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1aa60 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1aa70 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1aa80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1aa90 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1aaa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aab0 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1aac0 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1aad0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1aae0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1aaf0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1ab00 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1ab10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ab20 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1ab30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ab40 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1ab50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ab60 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1ab70 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1ab80 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1ab90 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1aba0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1abb0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1abc0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1abd0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1abe0 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1abf0 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1ac00 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1ac10 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1ac20 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1ac30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1ac40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1ac50 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1ac60 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1ac70 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1ac80 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1ac90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aca0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1acb0 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1acc0 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1acd0 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1ace0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1acf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1ad00 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1ad10 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1ad20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1ad30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1ad40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1ad50 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1ad60 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1ad70 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1ad80 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1ad90 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1ada0 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1adb0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1adc0 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1add0 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1ade0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1adf0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1ae00 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1ae10 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1ae20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1ae30 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1ae40 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1ae50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ae60 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1ae70 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1ae80 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1ae90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1aea0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1aeb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aec0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1aed0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1aee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1af00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1af10 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1af20 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1af30 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1af40 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1af50 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1af60 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1af70 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1af80 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1af90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1afa0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1afb0 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1afc0 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1afd0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1afe0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1aff0 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1b000 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1b010 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1b020 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1b030 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1b040 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1b050 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1b060 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1b070 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1b080 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b090 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b0a0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b0b0 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b0c0 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b0d0 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b0e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b0f0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b100 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b110 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b120 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b130 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b140 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b150 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b160 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b170 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b180 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b190 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b1a0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b1b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b1c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b1d0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b1e0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b1f0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b200 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b210 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b220 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b230 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b240 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b250 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b260 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b270 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b280 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b290 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b2a0 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b2b0 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b2c0 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b2d0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b2e0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b2f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b300 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b310 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b320 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b330 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b340 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b350 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b360 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b370 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b380 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b390 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b3a0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b3b0 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b3c0 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b3d0 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b3e0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b3f0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b400 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b410 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b420 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b430 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b440 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b450 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b460 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b470 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b480 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b490 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b4a0 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b4b0 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b4c0 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b4d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b4e0 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b4f0 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b500 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b510 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b530 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b540 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b550 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b560 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b570 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b580 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b590 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b5a0 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b5b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b5c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b5e0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b5f0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b600 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b610 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b620 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b630 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b640 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b650 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b660 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b670 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b680 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b690 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b6a0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b6b0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b6c0 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b6e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b6f0 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b700 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b710 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b720 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b730 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b740 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b750 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b760 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b770 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b780 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b790 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b7a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b7b0 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b7c0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b7d0 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b7e0 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b7f0 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b800 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b810 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b820 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b830 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b840 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b850 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b860 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b870 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b880 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b890 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b8a0 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b8b0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b8c0 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b8d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b8e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b8f0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b900 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b910 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b920 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1b930 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1b940 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1b950 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1b960 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1b970 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1b980 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1b990 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1b9a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b9b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b9c0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1b9d0 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1b9e0 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1b9f0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1ba00 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1ba10 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ba20 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1ba30 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1ba40 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1ba50 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1ba60 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1ba70 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1ba80 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1ba90 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1baa0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1bab0 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1bac0 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1bad0 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1bae0 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1baf0 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1bb00 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1bb10 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1bb20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1bb30 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1bb40 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bb50 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bb60 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1bb70 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bb80 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bb90 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bba0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bbb0 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bbc0 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bbd0 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bbe0 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bbf0 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bc00 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bc10 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bc20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bc30 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bc40 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bc50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bc60 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bc70 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bc80 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bc90 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bca0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bcb0 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bcc0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bcd0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bce0 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bcf0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bd00 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bd10 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bd20 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1bd30 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1bd40 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1bd50 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bd60 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1bd70 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1bd80 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1bd90 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1bda0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1bdb0 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1bdc0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1bdd0 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1bde0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1bdf0 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1be00 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1be10 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1be20 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1be30 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1be40 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1be50 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1be60 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1be70 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1be80 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1be90 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1bea0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1beb0 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1bec0 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1bed0 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1bee0 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1bef0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1bf00 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1bf10 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1bf20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1bf30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1bf40 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1bf50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1bf60 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1bf70 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1bf80 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1bf90 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1bfa0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1bfb0 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1bfc0 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1bfd0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1bfe0 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1bff0 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1c000 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1c010 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1c020 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c030 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1c040 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1c050 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1c060 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1c070 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1c080 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c090 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c0a0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c0b0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c0c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c0d0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c0e0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c0f0 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c100 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c110 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c120 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c130 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c140 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c150 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c160 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c170 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c180 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c190 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c1a0 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c1b0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c1c0 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c1d0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c1e0 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c1f0 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c200 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c210 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c220 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c230 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c240 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c250 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c260 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c270 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c280 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c290 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c2a0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c2b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c2c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c2d0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c2e0 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c300 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c320 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c340 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c350 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c360 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c370 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c380 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c390 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c3a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c3b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c3c0 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c3d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c3e0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c3f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c400 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c410 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c420 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c430 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c440 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c450 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c460 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c470 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c480 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c490 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c4a0 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c4b0 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c4c0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c4d0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c4e0 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c4f0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a  rom journal */..
1c500 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1c510 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1c520 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1c530 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1c540 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1c550 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1c560 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1c570 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1c580 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1c590 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c5a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1c5b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c5c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1c5d0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c5e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1c5f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1c600 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1c610 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1c620 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1c630 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1c640 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1c650 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1c660 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1c670 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1c680 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1c690 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1c6a0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1c6b0 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1c6c0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1c6d0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1c6e0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1c6f0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1c700 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1c710 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1c720 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1c730 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1c740 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1c750 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1c760 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1c770 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1c780 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c790 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1c7a0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1c7b0 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1c7c0 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1c7d0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1c7e0 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1c7f0 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1c800 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1c810 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c820 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1c830 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c840 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c850 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c860 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c870 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1c880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1c890 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1c8a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1c8b0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1c8c0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1c8d0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1c8e0 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1c8f0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1c900 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1c910 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1c920 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1c930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c940 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1c950 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1c960 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1c970 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1c980 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1c990 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1c9a0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1c9b0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1c9c0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1c9d0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1c9e0 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1c9f0 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ca00 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ca10 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ca20 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1ca30 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1ca40 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1ca50 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1ca60 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1ca70 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1ca80 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1ca90 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1caa0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1cab0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1cac0 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1cad0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1cae0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1caf0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1cb00 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1cb10 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1cb20 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1cb30 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1cb40 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1cb50 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1cb60 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1cb70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1cb80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cb90 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1cba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cbb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1cbc0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cbd0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1cbe0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1cbf0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1cc00 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1cc10 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cc20 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1cc30 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1cc40 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1cc50 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1cc60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1cc70 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1cc80 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1cc90 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1cca0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1ccb0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1ccc0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1ccd0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1cce0 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1ccf0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1cd00 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1cd10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cd20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1cd30 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1cd40 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1cd50 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1cd60 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1cd70 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1cd80 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1cd90 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1cda0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1cdb0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1cdc0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1cdd0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1cde0 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1cdf0 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1ce00 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1ce10 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1ce20 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1ce30 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1ce40 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1ce50 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1ce60 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1ce70 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1ce80 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1ce90 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1cea0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ceb0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1cec0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1ced0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1cee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cef0 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1cf00 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1cf10 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1cf20 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1cf30 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1cf40 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1cf50 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1cf60 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1cf70 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1cf80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cf90 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1cfa0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1cfb0 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1cfc0 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1cfd0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1cfe0 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1cff0 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1d000 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1d010 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1d020 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1d030 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1d040 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1d050 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1d060 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1d070 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1d080 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1d090 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1d0a0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1d0b0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1d0c0 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1d0d0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1d0e0 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1d0f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d100 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1d110 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d120 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1d130 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1d140 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1d150 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1d160 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1d170 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1d180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d190 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d1a0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1d1b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1d1c0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1d1d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d1e0 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1d1f0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1d200 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1d210 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d220 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1d230 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1d240 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1d250 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1d260 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d290 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1d2a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1d2b0 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1d2c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1d2d0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1d2e0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1d2f0 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1d300 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1d310 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1d320 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1d330 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1d340 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1d350 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1d360 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1d370 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1d380 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1d390 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1d3a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d3b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d3c0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1d3d0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1d3e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1d3f0 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1d400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d410 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1d420 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  k++;.      }else
1d430 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
1d440 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1d450 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d460 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1d470 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1d480 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1d490 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1d4a0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1d4b0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1d4c0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1d4d0 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1d4e0 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1d4f0 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1d500 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d510 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1d520 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1d530 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1d540 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1d550 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1d560 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1d570 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1d580 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1d590 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1d5a0 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1d5b0 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1d5c0 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1d5d0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1d5e0 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1d5f0 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1d600 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1d610 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1d620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1d640 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1d650 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1d660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d670 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1d680 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1d690 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1d6a0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1d6b0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1d6c0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1d6d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1d6e0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1d6f0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1d700 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1d710 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1d720 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1d730 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1d740 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1d750 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1d760 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1d770 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1d780 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1d790 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d7a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d7c0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1d7d0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1d7e0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1d7f0 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
1d800 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1d810 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1d820 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1d830 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1d840 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1d850 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1d860 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1d870 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1d880 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1d890 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1d8a0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1d8b0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1d8c0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1d8d0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1d8e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1d8f0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1d900 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d910 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1d920 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1d930 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ds ){.    sqlite
1d940 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1d950 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1d960 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d970 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a  CHANGED,0);.  }.
1d980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1d990 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1d9a0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1d9b0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1d9c0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1d9d0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1d9e0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1d9f0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1da00 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1da10 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1da20 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1da30 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1da40 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1da50 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1da60 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1da70 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1da80 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1da90 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1daa0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1dab0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1dac0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1dad0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1dae0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1daf0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1db00 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1db10 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1db20 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1db30 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1db40 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1db50 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1db60 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1db70 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1db80 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1db90 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1dba0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1dbb0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1dbc0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1dbd0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1dbe0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1dbf0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1dc00 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1dc10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dc20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1dc30 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1dc40 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1dc50 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1dc60 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1dc70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1dc80 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1dc90 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1dca0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1dcb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dcc0 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1dcd0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1dce0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1dcf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1dd00 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1dd10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd20 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1dd30 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1dd40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dd50 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1dd60 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1dd70 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1dd80 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1dd90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1dda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ddb0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1ddc0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1ddd0 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1dde0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1ddf0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1de00 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1de10 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1de20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1de30 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1de40 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1de50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1de60 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1de70 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1de80 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1de90 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1dea0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1deb0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1dec0 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1ded0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1dee0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1def0 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1df00 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1df10 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1df20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1df30 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1df40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1df50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1df60 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1df70 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1df80 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1df90 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1dfa0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1dfb0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1dfc0 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1dfd0 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1dfe0 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1dff0 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1e000 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1e010 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1e020 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1e030 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1e040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1e050 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1e060 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1e070 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1e080 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20 6f  abase file (or o
1e090 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c  ut of.** the WAL
1e0a0 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65 72   if that is wher
1e0b0 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
1e0c0 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64 29  t copy if found)
1e0d0 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1e0e0 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1e0f0 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1e100 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1e110 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1e120 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1e130 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e140 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1e150 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1e160 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1e170 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1e180 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1e190 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1e1a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e1b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1e1c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1e1d0 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1e1e0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1e1f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1e200 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1e210 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e220 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e230 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1e240 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1e250 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e260 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1e270 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1e280 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1e290 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  Pg */.  int rc =
1e2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e2b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e2c0 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 69 46 72  ode */.  u32 iFr
1e2d0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
1e2e0 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f        /* Frame o
1e2f0 66 20 57 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67  f WAL containing
1e300 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65   pgno */..  asse
1e310 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e320 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1e330 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1e340 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1e350 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1e360 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1e370 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1e380 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e390 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e3a0 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e3b0 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e3c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e3d0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46  rc;.  }.  if( iF
1e3e0 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  rame ){.    rc =
1e3f0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1e400 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1e410 6c 2c 20 69 46 72 61 6d 65 2c 70 50 61 67 65 72  l, iFrame,pPager
1e420 2d 3e 70 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e  ->pageSize,pPg->
1e430 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  pData);.  }else{
1e440 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1e450 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29   = (pPg->pgno-1)
1e460 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1e470 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1e480 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1e490 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1e4a0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1e4b0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
1e4c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e4d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1e4e0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1e4f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e500 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e510 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b   pPg->pgno==1 ){
1e520 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e530 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1e540 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1e550 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1e560 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1e570 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1e580 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1e590 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1e5a0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1e5b0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1e5c0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1e5d0 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1e5e0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1e5f0 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1e600 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1e610 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1e620 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e630 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1e640 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1e650 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1e660 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1e670 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1e680 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1e690 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1e6a0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1e6b0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1e6c0 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1e6d0 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1e6e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e6f0 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1e700 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1e710 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1e720 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1e730 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1e740 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1e750 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1e760 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1e770 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1e780 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1e790 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1e7a0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1e7b0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1e7c0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1e7d0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1e7e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e7f0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1e800 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1e810 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e820 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e840 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1e850 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1e860 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1e870 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1e880 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1e890 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1e8a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e8b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1e8c0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1e8d0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
1e8e0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1e8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
1e900 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1e910 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1e920 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1e930 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1e940 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1e950 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1e960 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1e970 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  ->pgno));.  PAGE
1e980 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1e990 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1e9a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1e9b0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1e9c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1e9d0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1e9e0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1e9f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ea00 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1ea10 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1ea20 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1ea30 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1ea40 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1ea50 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1ea60 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1ea70 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1ea80 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1ea90 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1eaa0 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1eab0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1eac0 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1ead0 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1eae0 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1eaf0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1eb00 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1eb10 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1eb20 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1eb30 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1eb40 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1eb50 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1eb60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1eb70 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1eb80 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1eb90 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1eba0 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1ebb0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1ebc0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1ebd0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1ebe0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1ebf0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1ec00 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1ec10 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1ec20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1ec30 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1ec40 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ec50 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1ec60 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1ec70 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1ec80 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1ec90 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1eca0 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1ecb0 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1ecc0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1ecd0 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1ece0 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1ecf0 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1ed00 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1ed10 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1ed20 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1ed30 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1ed40 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1ed50 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1ed60 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1ed70 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1ed80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1ed90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1eda0 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1edb0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1edc0 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1edd0 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1ede0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1edf0 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1ee00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ee10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1ee20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1ee30 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ee40 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1ee50 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1ee60 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1ee70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ee80 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1ee90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1eea0 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1eeb0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1eec0 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1eed0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1eee0 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1eef0 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1ef00 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1ef10 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1ef20 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1ef30 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1ef40 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1ef50 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ef60 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1ef70 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1ef80 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1ef90 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1efa0 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1efb0 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1efc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1efd0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1efe0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1eff0 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1f000 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1f010 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1f020 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f030 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f040 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1f050 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1f060 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1f070 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f080 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1f090 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f0a0 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1f0b0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1f0c0 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1f0d0 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1f0e0 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1f0f0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1f100 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1f110 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1f120 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1f130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f150 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1f160 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1f170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f180 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1f190 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1f1a0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1f1b0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1f1c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1f1d0 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1f1e0 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1f1f0 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1f200 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1f210 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1f220 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1f230 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1f240 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1f250 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1f260 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1f270 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1f280 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1f290 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1f2a0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1f2b0 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1f2c0 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1f2d0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1f2e0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1f2f0 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1f300 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1f310 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1f320 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1f330 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1f340 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1f350 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1f360 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1f370 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1f380 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1f390 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1f3a0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1f3b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f3c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f3d0 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1f3e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1f3f0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1f400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f410 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1f420 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f430 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1f460 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1f470 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1f480 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1f490 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1f4a0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1f4b0 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1f4c0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1f4d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1f4e0 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1f4f0 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1f500 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1f510 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1f520 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1f530 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1f540 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1f550 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1f560 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1f570 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1f580 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1f590 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1f5a0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1f5b0 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1f5c0 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1f5d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1f5e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1f5f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f600 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1f610 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1f620 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1f630 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1f640 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1f650 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1f660 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1f670 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1f680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f690 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1f6a0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1f6b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1f6c0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1f6d0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1f6e0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1f6f0 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1f700 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f710 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f720 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1f730 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1f740 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1f750 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1f760 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1f770 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1f780 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1f790 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1f7a0 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1f7b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1f7c0 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1f7d0 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1f7e0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1f7f0 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1f800 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1f810 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1f820 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1f830 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1f840 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1f850 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1f860 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1f870 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1f880 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1f890 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1f8a0 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1f8b0 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1f8c0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1f8d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1f8e0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1f8f0 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1f900 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1f910 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1f920 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1f930 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1f940 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1f950 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f960 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1f970 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1f980 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9a0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1f9b0 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1f9c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f9f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1fa00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fa20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1fa30 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1fa40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1fa60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1fa70 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1fa80 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1fa90 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1faa0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1fab0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1fac0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1fad0 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1fae0 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1faf0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1fb00 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1fb10 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fb20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1fb30 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1fb40 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1fb50 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1fb60 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1fb70 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1fb80 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1fb90 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1fba0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1fbb0 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1fbc0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1fbd0 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1fbe0 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1fbf0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1fc00 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1fc10 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1fc20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1fc30 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1fc40 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1fc50 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1fc60 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1fc70 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1fc80 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1fc90 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1fca0 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1fcb0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1fcc0 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1fcd0 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1fce0 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1fcf0 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1fd00 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1fd10 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1fd20 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1fd30 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fd40 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1fd50 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1fd60 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1fd70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1fd80 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1fd90 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1fda0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1fdb0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1fdc0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1fdd0 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1fde0 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1fdf0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1fe00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1fe10 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1fe20 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1fe30 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1fe40 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1fe50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fe60 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1fe70 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1fe80 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1fe90 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fea0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1feb0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1fec0 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1fed0 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1fee0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1fef0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1ff00 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1ff10 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1ff20 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1ff30 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1ff40 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1ff50 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1ff60 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1ff70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1ff80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ff90 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1ffa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1ffb0 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1ffc0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1ffd0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1ffe0 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1fff0 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
20000 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
20010 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
20020 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
20030 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
20040 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
20050 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
20060 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
20070 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
20080 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
20090 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
200a0 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
200b0 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
200c0 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
200d0 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
200e0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
200f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20100 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20130 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
20140 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
20150 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20160 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
20170 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
20180 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20190 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
201a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
201b0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
201c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
201d0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
201e0 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
201f0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
20200 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
20210 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
20220 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
20230 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
20240 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
20250 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
20260 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
20270 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
20280 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
20290 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
202a0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
202b0 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
202c0 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
202d0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
202e0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
202f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
20300 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
20310 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
20320 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
20330 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
20340 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
20350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
20360 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
20370 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
20380 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
20390 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
203a0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
203b0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
203c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
203d0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
203e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
203f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
20400 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
20410 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
20420 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
20430 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
20440 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
20450 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20460 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
20470 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
20480 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
20490 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
204a0 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
204b0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
204c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
204d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
204e0 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
204f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
20500 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
20510 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
20520 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
20530 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
20540 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
20550 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
20560 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
20570 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
20580 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
20590 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
205a0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
205b0 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
205c0 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
205f0 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
20600 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
20610 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
20620 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
20630 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
20640 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
20650 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
20660 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
20670 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
20680 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
20690 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
206a0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
206b0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
206c0 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
206d0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
206e0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
206f0 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
20700 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
20710 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
20720 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
20730 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
20740 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
20750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
20760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
20770 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
20780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
20790 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
207a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
207b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
207c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
207d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
207e0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
207f0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
20800 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
20810 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
20820 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
20830 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20840 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
20850 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
20860 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
20870 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
20880 6e 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  nt based on the 
20890 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
208a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
208b0 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
208c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
208d0 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a  e is not an.  **
208e0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
208f0 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
20900 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65  ze, round up the
20910 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
20920 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
20930 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50  ALWAYS(isOpen(pP
20940 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20  ager->fd)) ){.  
20950 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
20980 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
20990 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
209a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
209b0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
209c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
209d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
209e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
209f0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
20a00 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
20a10 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
20a20 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20a30 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
20a40 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
20a50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
20a60 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
20a70 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
20a80 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
20a90 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
20aa0 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
20ab0 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
20ac0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
20ad0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
20ae0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
20af0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
20b00 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20b10 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
20b20 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
20b30 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
20b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
20b50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20b60 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
20b70 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
20b80 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
20b90 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
20ba0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
20bb0 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
20bc0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20bd0 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
20be0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
20bf0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
20c00 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
20c10 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
20c20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20c30 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
20c40 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
20c50 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
20c60 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
20c70 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
20c80 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
20c90 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
20ca0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
20cb0 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
20cc0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
20cd0 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
20ce0 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
20cf0 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
20d00 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
20d10 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
20d20 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
20d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
20d40 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
20d50 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
20d60 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
20d70 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
20d80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20d90 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
20da0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
20db0 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
20dc0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
20dd0 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
20de0 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
20df0 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
20e00 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
20e10 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
20e20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
20e30 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
20e40 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
20e50 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
20e60 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
20e70 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
20e80 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
20e90 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
20ea0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
20eb0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
20ec0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20ed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20ee0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
20ef0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
20f00 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
20f10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
20f20 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
20f30 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
20f40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
20f50 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f70 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
20f80 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
20f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20fa0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20fb0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
20fc0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
20fd0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
20fe0 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b  S, &isWal.    );
20ff0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21010 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
21020 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21060 2a 2f 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  */..        rc =
21070 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
21080 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
21090 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
210a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
210b0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
210c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
210d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
210e0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
210f0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
21100 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
21110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  e{.          tes
21120 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
21130 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
21140 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
21150 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
21160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21170 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
21180 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
21190 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
211a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
211b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
211c0 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
211d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
211e0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
211f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
21200 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
21210 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21220 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
21230 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
21240 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
21250 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f  . Or, if pSavepo
21260 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20  int==NULL, then 
21270 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20  playback.** the 
21280 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
21290 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
212a0 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
212b0 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
212c0 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b  n .** a ROLLBACK
212d0 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69   TO command is i
212e0 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45  nvoked on a SAVE
212f0 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20  POINT that is a 
21300 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21310 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
21320 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74   When pSavepoint
21330 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65   is not NULL (me
21340 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e  aning a non-tran
21350 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
21360 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72  t is .** being r
21370 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65  olled back), the
21380 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63  n the rollback c
21390 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f  onsists of up to
213a0 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a   three stages,.*
213b0 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74  * performed in t
213c0 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69  he order specifi
213d0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  ed:.**.**   * Pa
213e0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62  ges are played b
213f0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
21400 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21410 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20  ng at byte.**   
21420 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61    offset PagerSa
21430 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
21440 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
21450 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  o .**     PagerS
21460 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21470 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65  set, or to the e
21480 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
21490 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
214a0 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70  le if PagerSavep
214b0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
214c0 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20  is zero..**.**  
214d0 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70   * If PagerSavep
214e0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
214f0 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
21500 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79  n pages are play
21510 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73  ed.**     back s
21520 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  tarting from the
21530 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21540 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
21550 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61  owing .**     Pa
21560 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21570 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65  rOffset to the e
21580 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
21590 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
215a0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
215b0 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63   then played bac
215c0 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  k from the sub-j
215d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61  ournal file, sta
215e0 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74  rting.**     wit
215f0 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  h the PagerSavep
21600 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64  oint.iSubRec and
21610 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
21620 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20  he end of.**    
21630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21640 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68  e..**.** Through
21650 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  out the rollback
21660 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74   process, each t
21670 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f  ime a page is ro
21680 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a  lled back, the.*
21690 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
216a0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20  bit is set in a 
216b0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
216c0 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65   (variable pDone
216d0 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65   in the.** imple
216e0 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29  mentation below)
216f0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
21700 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20  o ensure that a 
21710 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  page is only.** 
21720 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
21730 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73  first time it is
21740 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
21750 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  either journal..
21760 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f  **.** If pSavepo
21770 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  int is NULL, the
21780 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79  n pages are only
21790 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
217a0 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  m the main.** jo
217b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
217c0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
217d0 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69   a bitvec in thi
217e0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s case..**.** In
217f0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65   either case, be
21800 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f  fore playback co
21810 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65  mmences the Page
21820 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  r.dbSize variabl
21830 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f  e.** is reset to
21840 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
21850 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73  it held at the s
21860 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65  tart of the save
21870 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72  point .** (or tr
21880 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70  ansaction). No p
21890 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d  age with a page-
218a0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
218b0 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  han this value.*
218c0 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  * is played back
218d0 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f  . If one is enco
218e0 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69  untered it is si
218f0 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  mply skipped..*/
21900 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21910 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
21920 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
21930 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  , PagerSavepoint
21940 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20   *pSavepoint){. 
21950 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
21960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66            /* Eff
21970 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
21980 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21990 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
219a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
219b0 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
219c0 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
219d0 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
219e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
219f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
21a00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21a10 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
21a20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
21a30 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
21a40 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
21a50 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  nly once */..  a
21a60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
21a70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
21a80 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
21a90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
21aa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
21ab0 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  KED );..  /* All
21ac0 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
21ad0 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
21ae0 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
21af0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
21b00 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
21b10 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
21b20 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
21b30 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
21b40 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
21b50 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
21b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21b70 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
21b80 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
21b90 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
21ba0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
21bb0 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
21bc0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
21bd0 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
21be0 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
21bf0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
21c00 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
21c10 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
21c20 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
21c30 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
21c40 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
21c50 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
21c60 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
21c70 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
21c80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21c90 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
21ca0 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
21cb0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
21cc0 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
21cd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
21ce0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
21cf0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
21d00 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
21d10 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
21d20 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
21d30 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
21d40 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
21d50 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
21d60 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
21d70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
21d80 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
21d90 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
21da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
21db0 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
21dc0 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
21dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
21df0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
21e00 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
21e10 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
21e20 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21e30 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
21e40 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21e50 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
21e60 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
21e70 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
21e80 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
21e90 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
21ea0 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
21eb0 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
21ec0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
21ed0 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
21ee0 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
21ef0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
21f00 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
21f10 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
21f20 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
21f30 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
21f40 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
21f50 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
21f60 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
21f70 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
21f80 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
21f90 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
21fa0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
21fb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
21fc0 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
21fd0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
21fe0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
21ff0 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
22000 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22010 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
22020 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
22030 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22040 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
22050 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
22060 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
22070 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22080 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22090 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
220a0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
220b0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
220c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
220d0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
220e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
220f0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
22100 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
22110 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
22120 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
22130 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
22140 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
22150 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
22160 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
22170 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
22180 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
22190 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
221a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
221b0 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
221c0 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
221d0 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
221e0 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
221f0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
22200 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
22210 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
22220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
22230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
22240 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
22250 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22260 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22270 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
22280 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
22290 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
222a0 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
222b0 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
222c0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
222d0 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
222e0 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
222f0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22300 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
22310 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
22320 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
22330 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
22340 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
22350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
22360 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
22370 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
22380 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
22390 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
223a0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
223b0 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
223c0 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
223d0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
223e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
223f0 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
22400 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22410 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
22420 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
22430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
22440 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
22450 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
22460 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
22470 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
22480 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
22490 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
224a0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
224b0 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
224c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
224d0 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
224e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
224f0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
22500 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
22510 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
22520 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
22530 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22540 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22550 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
22560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22580 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
22590 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
225a0 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
225b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
225c0 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
225d0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
225e0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
225f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
22600 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
22610 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
22620 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
22630 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
22640 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
22650 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
22660 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
22670 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
22680 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22690 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
226a0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
226b0 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  4)pSavepoint->iS
226c0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
226d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
226e0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
226f0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
22700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
22710 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
22720 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
22730 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
22740 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
22750 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
22760 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
22770 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
22780 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
22790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
227a0 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34  rt( offset==(i64
227b0 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  )ii*(4+pPager->p
227c0 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
227d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
227e0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
227f0 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
22800 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
22810 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22820 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
22830 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
22840 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
22850 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
22860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22870 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22880 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
22890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
228a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
228b0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
228c0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
228d0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
228e0 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
228f0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63  ttempting to rec
22900 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75  ycle clean and u
22910 6e 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a  nused pages..*/.
22920 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22930 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
22940 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22950 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
22960 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
22970 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
22980 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
22990 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
229a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
229b0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
229c0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
229d0 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65  llowed.** before
229e0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73   attempting to s
229f0 70 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f  pill pages to jo
22a00 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
22a10 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
22a20 6c 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  llsize(Pager *pP
22a30 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
22a40 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
22a50 74 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c  te3PcacheSetSpil
22a60 6c 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  lsize(pPager->pP
22a70 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
22a80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
22a90 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
22aa0 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20  P_SIZE based on 
22ab0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
22ac0 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a  e of szMmap..*/.
22ad0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
22ae0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67  rFixMaplimit(Pag
22af0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
22b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
22b10 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65  _SIZE>0.  sqlite
22b20 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
22b30 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69  ger->fd;.  if( i
22b40 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d  sOpen(fd) && fd-
22b50 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
22b60 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71  ion>=3 ){.    sq
22b70 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
22b80 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d      sz = pPager-
22b90 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61  >szMmap;.    pPa
22ba0 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d  ger->bUseFetch =
22bb0 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74   (sz>0);.    set
22bc0 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
22bd0 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
22be0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
22bf0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
22c00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
22c10 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d  _SIZE, &sz);.  }
22c20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
22c30 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22c40 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
22c50 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
22c60 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ade of the datab
22c70 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  ase file..*/.voi
22c80 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22c90 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72  tMmapLimit(Pager
22ca0 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
22cb0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
22cc0 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  .  pPager->szMma
22cd0 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61  p = szMmap;.  pa
22ce0 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
22cf0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
22d00 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   Free as much me
22d10 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
22d20 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
22d30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22d40 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65  PagerShrink(Page
22d50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
22d60 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e  lite3PcacheShrin
22d70 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
22d80 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
22d90 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20  ust settings of 
22da0 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f  the pager to tho
22db0 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  se specified in 
22dc0 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61  the pgFlags para
22dd0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
22de0 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c   "level" in pgFl
22df0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
22e00 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74  HRONOUS_MASK set
22e10 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  s the robustness
22e20 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
22e30 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
22e40 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
22e50 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
22e60 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67  s by.** changing
22e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
22e80 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
22e90 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
22ea0 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  s..** There are 
22eb0 66 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  four levels:.**.
22ec0 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
22ed0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
22ee0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
22ef0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
22f00 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
22f10 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
22f20 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
22f30 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
22f40 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
22f50 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22f60 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
22f70 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
22f80 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22f90 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
22fa0 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
22fb0 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
22fc0 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
22fd0 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
22fe0 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
22ff0 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
23000 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
23010 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
23020 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
23030 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
23040 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
23050 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
23060 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
23070 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
23080 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
23090 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
230a0 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
230b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
230c0 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
230d0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
230e0 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
230f0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
23100 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
23110 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
23120 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
23130 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
23140 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
23150 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
23160 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
23170 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
23180 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
23190 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
231a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
231b0 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
231c0 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
231d0 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
231e0 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
231f0 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
23200 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
23210 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
23220 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
23230 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
23240 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
23250 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
23260 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
23270 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
23280 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
23290 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
232a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
232b0 20 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68      EXTRA     Th
232c0 69 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20  is is like FULL 
232d0 65 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61  except that is a
232e0 6c 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69  lso syncs the di
232f0 72 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20  rectory.**      
23300 20 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e          that con
23310 74 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61  tains the rollba
23320 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72  ck journal after
23330 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
23350 75 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65  urnal is unlinke
23360 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  d..**.** The abo
23370 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
23380 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
23390 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
233a0 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
233b0 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
233c0 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
233d0 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
233e0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
233f0 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
23400 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
23410 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
23420 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
23430 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
23440 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
23450 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
23460 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
23470 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
23480 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
23490 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
234a0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
234b0 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
234c0 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
234d0 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
234e0 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
234f0 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
23500 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
23510 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
23520 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
23530 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
23540 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
23550 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
23560 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
23570 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
23580 4c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  L.  There is no 
23590 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
235a0 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45  en FULL.** and E
235b0 58 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64  XTRA for WAL mod
235c0 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  e..**.** Do not 
235d0 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
235e0 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
235f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
23600 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
23610 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
23620 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
23630 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
23640 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
23650 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
23660 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
23670 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
23680 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
23690 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
236a0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
236b0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
236c0 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
236d0 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
236e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
236f0 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
23700 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
23710 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
23720 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
23730 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
23740 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
23750 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
23760 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
23770 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
23780 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
23790 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
237a0 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
237b0 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
237c0 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
237d0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
237e0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
237f0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
23800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
23810 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
23820 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
23830 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70  lags(.  Pager *p
23840 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
23850 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65   The pager to se
23860 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66  t safety level f
23870 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
23880 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a   pgFlags      /*
23890 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a   Various flags *
238a0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
238b0 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20  level = pgFlags 
238c0 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
238d0 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20  OUS_MASK;.  if( 
238e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
238f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23900 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  noSync = 1;.    
23910 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
23920 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
23930 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
23940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
23950 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
23960 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
23970 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a  CHRONOUS_OFF ?1:
23980 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  0;.    pPager->f
23990 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e  ullSync = level>
239a0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
239b0 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20  US_FULL ?1:0;.  
239c0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
239d0 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47  ync = level==PAG
239e0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45  ER_SYNCHRONOUS_E
239f0 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  XTRA ?1:0;.  }. 
23a00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
23a10 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23a20 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
23a30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
23a40 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55  Flags & PAGER_FU
23a50 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
23a60 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23a70 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
23a80 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
23a90 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23aa0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23ab0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
23ac0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23ad0 6c 61 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e  lags = (pPager->
23ae0 73 79 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20  syncFlags<<2);. 
23af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
23b00 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
23b10 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
23b20 73 20 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  s |= pPager->syn
23b30 63 46 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66  cFlags;.  }.  if
23b40 28 20 28 70 67 46 6c 61 67 73 20 26 20 50 41 47  ( (pgFlags & PAG
23b50 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
23b60 43 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  C) && !pPager->n
23b70 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
23b80 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
23b90 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e  s |= (SQLITE_SYN
23ba0 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a  C_FULL<<2);.  }.
23bb0 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20    if( pgFlags & 
23bc0 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c  PAGER_CACHESPILL
23bd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23be0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
23bf0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23c00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
23c10 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
23c20 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a   SPILLFLAG_OFF;.
23c30 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
23c40 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
23c50 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
23c60 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
23c70 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
23c80 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
23c90 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
23ca0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
23cb0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
23cc0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
23cd0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
23ce0 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
23cf0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23d00 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
23d10 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
23d20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
23d30 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
23d40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
23d50 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
23d60 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
23d70 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
23d80 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
23d90 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
23da0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
23db0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
23dc0 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
23dd0 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
23de0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
23df0 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
23e00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
23e10 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
23e20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
23e30 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
23e40 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
23e50 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
23e60 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
23e70 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
23e80 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23e90 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
23ea0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23eb0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
23ec0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
23ed0 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
23ee0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23ef0 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
23f00 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
23f10 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23f20 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
23f30 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
23f40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
23f50 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
23f60 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
23f70 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
23f80 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
23f90 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
23fa0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
23fb0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
23fc0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23fd0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
23fe0 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
23ff0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
24000 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
24010 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
24020 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
24030 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
24040 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
24050 46 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53  Flags |=  .#if S
24060 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
24070 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
24080 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
24090 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
240a0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
240b0 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
240c0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
240d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
240e0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
240f0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
24100 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24110 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
24120 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
24130 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
24140 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
24150 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
24160 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
24170 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
24180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
24190 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
241a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
241b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
241c0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
241d0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
241e0 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
241f0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
24200 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
24210 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
24220 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
24230 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
24240 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
24250 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
24260 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
24270 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
24280 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
24290 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
242a0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
242b0 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
242c0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
242d0 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
242e0 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
242f0 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
24300 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24310 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
24320 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
24330 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
24340 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
24350 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
24360 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
24370 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
24380 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
24390 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
243a0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
243b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243e0 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
243f0 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
24400 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
24410 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
24420 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
24430 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
24440 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
24450 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
24460 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
24470 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
24480 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
24490 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
244a0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
244b0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
244c0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
244d0 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
244e0 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
244f0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
24500 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
24510 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
24520 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
24530 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
24540 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
24550 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
24560 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
24570 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
245a0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
245b0 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
245c0 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
245d0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
245e0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
245f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
24600 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
24610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
24620 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
24630 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
24640 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
24650 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
24660 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
24670 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
24680 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
24690 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
246a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
246b0 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
246c0 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
246d0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
246e0 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
246f0 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
24700 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
24710 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
24720 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
24730 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
24740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
24750 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
24760 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
24770 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
24780 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
24790 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
247a0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
247b0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
247c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
247d0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
247e0 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
247f0 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
24800 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24810 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
24820 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
24830 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24840 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
24850 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
24860 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
24870 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
24880 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
24890 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
248a0 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
248b0 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
248c0 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
248d0 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
248e0 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
248f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
24900 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24910 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
24920 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
24930 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
24940 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
24950 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
24960 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
24970 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
24980 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
24990 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
249a0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
249b0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
249c0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
249d0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
249e0 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
249f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
24a00 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
24a10 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
24a20 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
24a30 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
24a40 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
24a50 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
24a60 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
24a70 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
24a80 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24a90 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24aa0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
24ab0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
24ac0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
24ad0 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
24ae0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
24af0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24b00 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
24b10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
24b20 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
24b30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
24b40 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
24b50 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
24b60 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
24b70 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
24b80 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
24b90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24ba0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24bb0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
24bc0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
24bd0 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
24be0 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
24bf0 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
24c00 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
24c10 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
24c20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
24c30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
24c40 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
24c50 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24c60 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
24c70 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
24c80 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
24c90 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
24ca0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
24cb0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
24cc0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24cd0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
24ce0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
24cf0 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
24d00 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
24d10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24d20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
24d30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
24d40 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
24d50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24d60 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
24d70 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
24d80 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
24d90 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
24da0 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
24db0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
24dc0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
24dd0 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
24de0 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
24df0 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
24e00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
24e10 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
24e20 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
24e30 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
24e40 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
24e50 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
24e60 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
24e70 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
24e80 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
24e90 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
24ea0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
24eb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
24ec0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
24ed0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
24ee0 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
24ef0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
24f00 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
24f10 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
24f20 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
24f30 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
24f40 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24f50 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
24f60 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
24f70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
24f80 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
24f90 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24fa0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24fb0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
24fc0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
24fd0 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
24fe0 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
24ff0 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
25000 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
25010 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
25020 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
25030 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
25040 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25050 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
25060 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25070 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
25080 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
25090 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
250a0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
250b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
250c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
250d0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
250e0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
250f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
25100 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
25110 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
25120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25140 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
25150 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
25160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
25170 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
25180 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25190 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
251a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
251b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
251c0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
251d0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
251e0 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
251f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
25200 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65  New;.      pPage
25210 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
25220 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
25230 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
25240 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
25250 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
25260 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
25270 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
25280 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
25290 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
252a0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
252b0 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
252c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
252d0 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
252e0 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
252f0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
25300 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
25310 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
25320 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
25330 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
25340 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
25350 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
25360 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
25370 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
25380 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
25390 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
253a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
253b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
253c0 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
253d0 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
253e0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
253f0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
25400 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
25410 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
25420 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
25430 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
25440 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
25450 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
25460 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
25470 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
25480 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
25490 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
254a0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
254b0 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
254c0 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
254d0 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
254e0 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
254f0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
25500 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
25510 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
25520 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
25530 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25540 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
25550 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
25560 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
25570 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
25580 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
25590 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
255a0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
255b0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
255c0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
255d0 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
255e0 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
255f0 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
25600 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
25610 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
25620 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
25630 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
25640 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
25650 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
25660 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
25670 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25680 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
25690 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
256a0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
256b0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
256c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
256d0 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
256e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
256f0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
25700 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
25710 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
25720 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
25730 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25740 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
25750 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
25760 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
25770 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
25780 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
25790 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
257a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
257b0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
257c0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
257d0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
257e0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
257f0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
25800 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
25810 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
25820 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
25830 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
25840 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
25850 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
25860 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
25870 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
25880 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
25890 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
258a0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
258b0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
258c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
258d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
258e0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
258f0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
25900 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
25910 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
25920 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
25930 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
25940 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25950 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
25960 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25970 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
25980 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25990 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
259a0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
259b0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
259c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
259d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
259e0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
259f0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
25a00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25a10 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
25a20 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
25a30 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25a40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
25a50 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
25a60 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
25a70 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
25a80 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25a90 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25aa0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25ab0 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25ac0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25ad0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25ae0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
25af0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
25b00 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
25b10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25b20 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
25b30 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
25b40 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25b50 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
25b60 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
25b70 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
25b80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25b90 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25ba0 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25bb0 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25bc0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25bd0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25be0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
25bf0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
25c00 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
25c10 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
25c20 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
25c30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
25c40 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
25c50 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
25c60 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25c70 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
25c80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25c90 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25ca0 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25cc0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25cd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25ce0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
25cf0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
25d00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25d10 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
25d20 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
25d30 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
25d40 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
25d50 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
25d60 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
25d70 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
25d80 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
25d90 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
25da0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
25db0 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
25dc0 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
25dd0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
25de0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
25df0 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
25e00 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
25e10 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
25e20 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
25e30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
25e40 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
25e50 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
25e60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
25e70 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
25e80 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
25e90 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
25ea0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
25eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25ec0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
25ed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25f00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
25f10 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
25f20 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
25f30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
25f40 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
25f50 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
25f60 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
25f70 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
25f80 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
25f90 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
25fa0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
25fb0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
25fc0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
25fd0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
25fe0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
25ff0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
26000 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
26010 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
26020 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
26030 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
26040 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
26050 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
26060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26070 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
26080 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
26090 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
260a0 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
260b0 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
260c0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
260d0 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
260e0 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
260f0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
26100 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
26110 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
26120 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
26130 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26140 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
26150 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
26160 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
26170 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
26180 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
26190 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
261a0 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
261b0 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
261c0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
261d0 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
261e0 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
261f0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
26200 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
26210 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
26220 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
26230 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
26240 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
26250 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
26260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26270 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
26280 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
26290 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
262a0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
262b0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
262c0 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
262d0 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
262e0 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
262f0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
26300 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
26310 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
26320 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26330 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
26340 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
26350 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26380 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
26390 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
263a0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
263b0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
263c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
263d0 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
263e0 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
263f0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
26400 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
26410 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
26420 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
26430 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
26440 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
26450 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
26460 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
26470 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
26480 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
26490 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
264a0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
264b0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
264c0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
264d0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
264e0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
264f0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
26500 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
26510 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
26520 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
26530 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
26540 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
26550 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
26560 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
26570 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
26580 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
26590 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
265a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
265b0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
265c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
265d0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
265e0 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
265f0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
26600 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
26610 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
26620 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
26630 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
26640 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
26650 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
26660 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
26670 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
26680 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
26690 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
266a0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
266b0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
266c0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
266d0 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
266e0 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
266f0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
26700 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
26710 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
26720 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
26730 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
26740 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
26750 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
26760 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
26770 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
26780 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
26790 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
267a0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
267b0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
267c0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
267d0 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
267e0 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
267f0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
26800 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
26810 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
26820 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
26830 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26840 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
26850 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26860 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
26870 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
26880 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
26890 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
268a0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
268b0 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
268c0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
268d0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
268e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
268f0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
26900 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
26910 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
26920 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
26930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26940 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
26950 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
26960 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
26970 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
26980 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26990 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
269a0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
269b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
269c0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
269d0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
269e0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
269f0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
26a00 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
26a10 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
26a20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
26a30 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
26a40 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26a50 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26a60 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26a70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
26a80 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26aa0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26ab0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26ac0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26ad0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26ae0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26af0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
26b00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26b10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
26b20 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
26b30 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
26b40 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26b50 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
26b60 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
26b70 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26b80 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26b90 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26ba0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26bc0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26bd0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26be0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
26bf0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
26c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26c10 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
26c20 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
26c30 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
26c40 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
26c50 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
26c60 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
26c70 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
26c80 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26c90 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26ca0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26cc0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26cd0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26ce0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
26cf0 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
26d00 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
26d10 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
26d20 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
26d30 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
26d40 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
26d50 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
26d60 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
26d70 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
26d80 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
26d90 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
26da0 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
26db0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
26dc0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
26dd0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
26de0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
26df0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
26e00 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
26e10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
26e20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
26e30 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
26e40 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
26e50 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
26e60 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
26e70 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
26e80 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26e90 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
26ea0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
26eb0 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
26ec0 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
26ed0 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
26ee0 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
26ef0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
26f00 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
26f10 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
26f20 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
26f30 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
26f40 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
26f50 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
26f60 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
26f70 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
26f80 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
26f90 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
26fa0 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
26fb0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26fc0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26fd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
26fe0 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
26ff0 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
27000 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
27010 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
27020 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
27030 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
27040 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
27050 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
27060 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
27070 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
27080 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
27090 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
270a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
270b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
270c0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
270d0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
270e0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
270f0 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
27100 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
27110 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
27120 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
27130 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
27140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27150 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
27160 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
27170 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
27180 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
27190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
271a0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
271b0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
271c0 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
271d0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
271e0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
271f0 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
27200 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
27210 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
27220 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27230 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
27240 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
27250 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
27260 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
27270 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
27280 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
27290 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
272a0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
272b0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
272c0 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
272d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
272e0 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
272f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27300 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
27310 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
27320 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27330 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27350 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27360 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
27370 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
27380 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
27390 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
273a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
273b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
273c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
273d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
273e0 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
273f0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
27400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
27410 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27420 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62  _SIZE>0./*.** Ob
27430 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
27440 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
27450 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
27460 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
27470 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
27480 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
27490 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
274a0 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
274b0 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
274c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
274d0 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
274e0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
274f0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
27500 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
27510 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
27520 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
27530 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
27540 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
27550 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
27560 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
27570 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
27580 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
27590 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
275a0 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
275b0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
275c0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
275d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
275e0 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
275f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27610 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
27620 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27650 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
27660 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
27670 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
27680 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
27690 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
276a0 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
276c0 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
276d0 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
276e0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27700 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
27710 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
27720 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
27730 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27740 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
27750 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
27760 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
27780 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
27790 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
277a0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61  Dirty = 0;.    a
277b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
277c0 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20  Extra>=8 );.    
277d0 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
277e0 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 8);.  }else
277f0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27800 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
27810 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
27820 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
27830 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
27840 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
27850 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
27860 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27870 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
27880 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
27890 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
278a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
278b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
278c0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
278d0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
278e0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
278f0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
27900 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
27910 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
27920 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
27930 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
27940 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27950 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27960 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27970 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27980 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27990 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
279a0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
279b0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
279c0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
279d0 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
279e0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
279f0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
27a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27a10 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
27a20 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
27a30 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27a40 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27a50 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27a60 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27a70 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27a80 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27a90 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27aa0 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
27ab0 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
27ac0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27ad0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27ae0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27af0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
27b00 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
27b10 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27b20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27b30 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
27b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27b50 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27b60 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27b70 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27b80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27b90 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27ba0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27bb0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
27bc0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27bd0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27be0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
27bf0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
27c00 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
27c10 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
27c20 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
27c30 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
27c40 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27c50 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27c60 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27c70 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27c80 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27c90 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27ca0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
27cb0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
27cc0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
27cd0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
27ce0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
27cf0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
27d00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
27d10 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
27d20 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27d30 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
27d40 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27d50 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
27d60 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
27d70 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
27d80 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
27d90 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
27da0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
27db0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
27dc0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
27dd0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
27de0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
27df0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
27e00 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
27e10 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
27e20 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
27e30 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
27e40 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
27e50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27e60 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
27e70 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
27e80 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
27e90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
27ea0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27eb0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
27ec0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
27ed0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
27ee0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
27ef0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
27f00 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27f10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27f20 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
27f30 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ger, sqlite3 *db
27f40 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
27f50 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
27f60 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
27f70 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55  rt( db || pagerU
27f80 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
27f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
27fa0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
27fb0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
27fc0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
27fd0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
27fe0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
27ff0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
28000 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
28010 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
28020 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
28030 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
28040 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
28050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28060 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
28070 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d  t( db || pPager-
28080 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  >pWal==0 );.  sq
28090 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
280a0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20  ager->pWal, db, 
280b0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
280c0 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
280d0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64  geSize,.      (d
280e0 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  b && (db->flags 
280f0 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f  & SQLITE_NoCkptO
28100 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54  nClose) ? 0 : pT
28110 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65  mp).  );.  pPage
28120 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e  r->pWal = 0;.#en
28130 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
28140 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
28150 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
28160 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
28170 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
28180 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
28190 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
281a0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
281b0 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
281c0 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
281d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
281e0 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
281f0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
28200 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
28210 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
28220 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
28230 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
28240 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
28250 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
28260 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
28270 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
28280 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
28290 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
282a0 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
282b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
282c0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
282d0 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
282e0 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
282f0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
28300 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
28310 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
28320 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
28330 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
28340 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
28350 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
28360 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
28370 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
28380 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
28390 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
283a0 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
283b0 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
283c0 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
283d0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
283e0 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
283f0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
28400 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
28410 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
28420 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28430 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
28440 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
28450 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
28460 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
28470 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
28480 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
28490 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
284a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
284b0 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
284c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
284d0 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
284e0 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
284f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28500 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
28510 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
28520 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
28530 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
28540 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
28550 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
28560 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
28570 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
28580 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
28590 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
285a0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
285b0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
285c0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
285d0 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
285e0 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
285f0 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
28600 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
28610 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
28620 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
28630 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
28640 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
28650 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
28660 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28670 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
28680 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
28690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
286a0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
286b0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
286c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
286d0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
286e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
286f0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
28700 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
28710 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
28720 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
28730 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
28740 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
28750 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
28760 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
28770 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
28780 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
28790 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
287a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
287b0 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
287c0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
287d0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
287e0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
287f0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
28800 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
28810 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28820 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
28830 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
28840 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
28850 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
28860 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
28870 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
28880 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28890 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
288a0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
288b0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
288c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
288d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
288e0 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
288f0 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
28900 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
28910 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
28920 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
28930 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
28940 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
28950 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
28960 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
28970 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
28980 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
28990 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
289a0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
289b0 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
289c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
289d0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
289e0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
289f0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28a00 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
28a10 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
28a20 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
28a30 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
28a40 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
28a50 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
28a60 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
28a70 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
28a80 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
28a90 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
28aa0 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
28ab0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
28ac0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
28ad0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
28ae0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
28af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
28b00 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
28b10 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
28b20 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
28b30 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
28b40 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
28b50 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
28b60 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
28b70 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
28b80 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
28b90 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
28ba0 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
28bb0 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
28bc0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
28bd0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
28be0 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
28bf0 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
28c00 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
28c10 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28c20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
28c30 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
28c40 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
28c50 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
28c60 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
28c70 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
28c80 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
28c90 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
28ca0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
28cb0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28cc0 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
28cd0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
28ce0 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
28cf0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
28d00 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
28d10 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
28d20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
28d30 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
28d40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
28d50 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
28d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
28d70 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
28d80 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
28d90 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28dc0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
28dd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
28de0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28df0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
28e00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
28e10 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28e20 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
28e30 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28e40 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
28e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
28e60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
28e70 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
28e80 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
28e90 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
28ea0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28eb0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28ec0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
28ed0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
28ee0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
28ef0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
28f00 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
28f10 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
28f20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
28f30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
28f40 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
28f50 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
28f60 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
28f70 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
28f80 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
28f90 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
28fa0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28fb0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
28fc0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28fd0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
28fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
28ff0 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
29000 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
29010 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
29020 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
29030 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29040 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
29050 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
29060 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
29070 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
29080 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
29090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
290a0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
290b0 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
290c0 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
290d0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
290e0 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
290f0 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
29100 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
29110 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
29120 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
29130 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
29140 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
29150 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
29160 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
29170 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
29180 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
29190 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
291a0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
291b0 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
291c0 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
291d0 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
291e0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
291f0 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
29200 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
29210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
29220 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
29230 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
29240 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
29250 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
29260 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
29270 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
29280 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
29290 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
292a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
292b0 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
292c0 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
292d0 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
292e0 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
292f0 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
29300 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
29310 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
29320 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
29330 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
29340 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
29350 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
29360 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
29370 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
29380 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
29390 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
293a0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
293b0 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
293c0 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
293d0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
293e0 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
293f0 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
29400 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
29410 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
29420 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
29430 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
29440 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29450 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
29460 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
29470 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
29480 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
29490 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
294a0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
294b0 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
294c0 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
294d0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
294e0 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
294f0 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
29500 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
29510 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
29520 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
29530 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
29540 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
29550 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
29560 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
29570 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
29580 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
29590 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
295a0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
295b0 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
295c0 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
295d0 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
295e0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
295f0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
29600 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
29610 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29620 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
29630 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
29640 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
29650 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
29660 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
29680 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
29690 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
296a0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
296b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
296c0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
296d0 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
296e0 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
296f0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
29700 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
29710 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
29720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29730 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
29740 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
29750 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29780 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
29790 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
297a0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
297b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
297c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
297d0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
297e0 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
297f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
29800 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
29810 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
29820 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
29830 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
29840 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
29850 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
29860 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
29870 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
29880 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
29890 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
298a0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
298b0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
298c0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
298d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
298e0 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
298f0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
29900 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
29910 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
29920 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
29930 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
29940 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
29950 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
29960 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
29970 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
29980 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
29990 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
299a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
299b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
299c0 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
299d0 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
299e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
299f0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
29a00 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
29a10 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
29a20 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
29a30 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29a40 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
29a50 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29a60 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
29a80 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
29a90 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
29aa0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29ab0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
29ac0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29ad0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29af0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
29b00 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
29b10 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
29b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29b30 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29b40 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
29b50 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29b60 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
29b70 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
29b80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
29b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29ba0 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
29bb0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
29bc0 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
29bd0 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
29be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29bf0 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
29c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29c10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29c20 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
29c30 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
29c40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
29c50 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
29c60 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29c70 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
29c80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29c90 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
29ca0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
29cb0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
29cc0 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
29cd0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
29ce0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
29cf0 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
29d00 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
29d10 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
29d20 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
29d30 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
29d40 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
29d50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29d60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29d70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
29d80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
29d90 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
29da0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
29db0 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
29dc0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
29dd0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
29de0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
29df0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
29e00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29e10 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
29e20 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29e40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
29e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29e60 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
29e70 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
29e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29ea0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
29eb0 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
29ec0 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
29ed0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
29ee0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
29ef0 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
29f00 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
29f10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29f20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
29f30 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
29f40 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
29f50 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
29f60 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
29f70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
29f80 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
29f90 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
29fa0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
29fb0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
29fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
29fe0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
29ff0 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
2a000 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
2a010 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
2a020 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
2a030 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
2a040 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
2a050 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
2a060 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
2a070 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
2a080 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2a090 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
2a0a0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
2a0b0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
2a0c0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
2a0d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2a0e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2a0f0 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
2a100 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
2a110 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
2a120 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
2a130 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a140 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
2a150 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
2a160 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
2a170 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
2a180 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
2a190 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
2a1a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
2a1b0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
2a1c0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
2a1d0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a1e0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
2a1f0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
2a200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a210 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
2a220 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
2a230 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
2a240 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
2a250 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
2a260 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
2a270 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
2a280 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
2a290 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
2a2a0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
2a2b0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
2a2c0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
2a2d0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
2a2e0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
2a2f0 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
2a300 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2a310 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2a320 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
2a330 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
2a340 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
2a350 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
2a360 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
2a370 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2a380 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
2a390 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2a3a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
2a3b0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
2a3c0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
2a3d0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
2a3e0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
2a3f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
2a400 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
2a410 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
2a420 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a430 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
2a440 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
2a450 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
2a460 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
2a470 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
2a480 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
2a490 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
2a4a0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
2a4b0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
2a4c0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
2a4d0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
2a4e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2a4f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a500 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
2a510 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a520 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2a530 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
2a540 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2a550 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
2a560 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
2a570 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
2a580 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
2a590 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a5a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a5b0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
2a5c0 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
2a5d0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
2a5e0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
2a5f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a610 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a620 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2a630 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
2a640 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
2a650 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
2a660 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
2a670 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
2a680 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a6a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
2a6b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2a6c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
2a6d0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
2a6e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2a6f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
2a700 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2a710 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2a720 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  | pList->pDirty=
2a730 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
2a740 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
2a750 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
2a760 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
2a770 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
2a780 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
2a790 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
2a7a0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
2a7b0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
2a7c0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
2a7d0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
2a7e0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
2a7f0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
2a800 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
2a810 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2a820 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
2a830 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
2a840 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
2a850 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
2a860 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
2a870 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
2a880 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
2a890 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
2a8a0 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
2a8b0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
2a8c0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
2a8d0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
2a8e0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
2a8f0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
2a900 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2a910 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2a920 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2a930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a940 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
2a950 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
2a960 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
2a970 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
2a980 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
2a990 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2a9a0 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
2a9b0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
2a9c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
2a9d0 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
2a9e0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
2a9f0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
2aa00 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
2aa10 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
2aa20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
2aa30 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
2aa40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
2aa50 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
2aa60 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
2aa70 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2aa80 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2aa90 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
2aaa0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
2aab0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2aac0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
2aad0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
2aae0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
2aaf0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
2ab00 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
2ab10 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
2ab20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
2ab30 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
2ab40 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
2ab50 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
2ab60 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
2ab70 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
2ab80 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
2ab90 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
2aba0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
2abb0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
2abc0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
2abd0 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
2abe0 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
2abf0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
2ac00 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
2ac10 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
2ac20 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2ac30 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
2ac40 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
2ac50 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
2ac60 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
2ac70 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2ac80 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
2ac90 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
2aca0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
2acb0 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
2acc0 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
2acd0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2ace0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
2ad10 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
2ad20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
2ad30 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2ad40 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2ad50 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2ad60 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
2ad70 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
2ad80 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
2ad90 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
2ada0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2adb0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2adc0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
2add0 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
2ade0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2adf0 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  KPT, pData);..  
2ae00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
2ae10 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
2ae20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2ae30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2ae40 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
2ae50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2ae60 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
2ae70 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
2ae80 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
2ae90 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
2aea0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
2aeb0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
2aec0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
2aed0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2aee0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
2aef0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
2af00 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
2af10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2af20 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
2af30 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
2af40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
2af50 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
2af60 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2af70 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
2af80 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
2af90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2afa0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
2afb0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
2afc0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2afd0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2afe0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
2aff0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
2b000 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
2b010 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
2b020 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
2b030 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
2b040 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
2b050 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2b060 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
2b070 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
2b080 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
2b090 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
2b0a0 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
2b0b0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
2b0c0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
2b0d0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
2b0e0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2b100 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2b110 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
2b120 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
2b130 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
2b140 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
2b150 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
2b160 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2b170 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2b180 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
2b190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
2b1a0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
2b1b0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
2b1c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b1d0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
2b1e0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
2b1f0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
2b200 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
2b210 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
2b220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b230 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
2b240 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
2b250 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
2b260 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2b270 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
2b280 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2b290 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
2b2a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2b2b0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
2b2c0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
2b2d0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
2b2e0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
2b2f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2b300 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
2b310 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2b320 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
2b330 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
2b340 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
2b350 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2b360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b370 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2b380 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2b390 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
2b3a0 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50  ags =  SQLITE_OP
2b3b0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
2b3c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2b3d0 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53  WRITE .      | S
2b3e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2b3f0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
2b400 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20  EXCLUSIVE .     
2b410 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
2b420 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
2b430 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c    int nStmtSpill
2b440 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
2b450 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
2b460 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2b470 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2b480 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2b490 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
2b4a0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2b4b0 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d      nStmtSpill =
2b4c0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
2b4d0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2b4e0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  alOpen(pPager->p
2b4f0 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Vfs, 0, pPager->
2b500 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74  sjfd, flags, nSt
2b510 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20  mtSpill);.  }.  
2b520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b530 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
2b540 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
2b550 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
2b560 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2b570 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20  journal. .**.** 
2b580 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2b590 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
2b5a0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
2b5b0 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
2b5c0 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
2b5d0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2b5e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b5f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2b600 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2b610 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2b620 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2b630 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
2b640 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2b650 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
2b660 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2b670 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2b680 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2b690 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
2b6a0 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
2b6b0 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
2b6c0 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
2b6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
2b6e0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
2b6f0 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
2b700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b710 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2b720 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2b730 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2b740 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2b750 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2b760 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
2b770 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2b780 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
2b790 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
2b7a0 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
2b7b0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2b7c0 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
2b7d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2b7e0 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
2b7f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2b800 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2b810 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2b820 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
2b830 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
2b840 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2b850 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
2b860 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
2b870 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
2b880 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
2b890 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2b8a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2b8b0 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
2b8c0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2b8d0 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
2b8e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b8f0 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
2b900 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
2b910 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
2b920 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
2b930 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
2b940 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
2b950 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2b960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b970 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
2b980 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
2b990 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2b9a0 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
2b9b0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
2b9c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2b9d0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23  char *pData2;..#
2b9e0 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
2b9f0 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28  DEC   .      if(
2ba00 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e   !pPager->subjIn
2ba10 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2ba20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2ba30 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2ba40 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2ba50 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2ba60 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d  pData2);.      }
2ba70 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2ba80 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61    pData2 = pData
2ba90 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2baa0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2bab0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2bac0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2bad0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2bae0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2baf0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2bb00 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2bb10 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2bb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2bb40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2bb50 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2bb60 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2bb70 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2bb80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bb90 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2bba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2bbb0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2bbc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2bbd0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2bbe0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2bbf0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2bc00 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2bc10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2bc20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2bc30 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2bc40 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2bc50 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2bc60 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2bc70 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2bc80 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2bc90 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2bca0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2bcb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2bcc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2bcd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2bce0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2bcf0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2bd00 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2bd10 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2bd20 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2bd30 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2bd40 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2bd50 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2bd60 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2bd70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2bd80 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2bd90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2bda0 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2bdb0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2bdc0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2bdd0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2bde0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2bdf0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2be00 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2be10 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2be20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2be30 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2be40 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2be50 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2be60 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2be70 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2be80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2be90 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2bea0 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2beb0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2bec0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2bed0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2bee0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2bef0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2bf00 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2bf10 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2bf20 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2bf30 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2bf40 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2bf50 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2bf60 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2bf70 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2bf80 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2bf90 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2bfa0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2bfb0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2bfc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2bfd0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2bfe0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2bff0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2c000 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2c010 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2c020 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2c030 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2c040 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2c050 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2c060 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2c070 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2c080 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2c090 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2c0a0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2c0b0 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2c0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2c0d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2c0e0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2c0f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2c100 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2c110 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2c120 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2c130 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2c140 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2c150 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2c160 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2c170 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2c180 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2c190 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2c1a0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2c1b0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c1c0 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2c1d0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2c1e0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2c1f0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2c200 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2c210 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2c220 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2c230 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2c240 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2c250 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2c260 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2c270 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2c280 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2c290 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2c2a0 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2c2b0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2c2c0 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2c2d0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2c2e0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2c2f0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2c300 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2c310 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2c320 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2c330 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2c340 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2c350 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2c360 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2c370 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2c380 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2c390 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2c3a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2c3b0 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2c3c0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2c3d0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2c3e0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2c3f0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2c400 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2c410 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2c420 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2c430 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2c440 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2c450 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2c460 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2c470 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2c480 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2c490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2c4a0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2c4b0 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2c4c0 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2c4d0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2c4e0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2c4f0 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2c500 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2c510 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2c520 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2c530 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c540 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c550 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2c560 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2c570 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2c580 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2c590 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2c5a0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2c5b0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2c5c0 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2c5d0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2c5e0 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2c5f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2c610 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
2c620 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
2c630 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
2c640 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
2c650 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
2c660 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
2c670 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
2c680 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2c690 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a  Required(pPg); .
2c6a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2c6c0 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
2c6d0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
2c6e0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2c6f0 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66 64 65  else{.    .#ifde
2c700 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c710 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
2c720 54 45 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  TE.    if( pPage
2c730 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
2c740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2c750 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2c760 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2c770 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c780 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2c790 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2c7a0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
2c7b0 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 2f 2a  #endif.  .    /*
2c7c0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2c7d0 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2c7e0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2c7f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c800 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2c810 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2c820 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2c830 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2c840 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2c850 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2c860 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2c870 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
2c880 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2c890 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
2c8a0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2c8b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c8c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2c8d0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
2c8e0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2c8f0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
2c900 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2c910 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
2c920 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
2c930 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2c940 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
2c950 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2c960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
2c970 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
2c980 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2c990 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2c9a0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2c9b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2c9c0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
2c9d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
2c9e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2c9f0 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc); .}../*.** 
2ca00 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65  Flush all unrefe
2ca10 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67  renced dirty pag
2ca20 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  es to disk..*/.i
2ca30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  nt sqlite3PagerF
2ca40 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67  lush(Pager *pPag
2ca50 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2ca60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2ca70 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
2ca80 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73  .    PgHdr *pLis
2ca90 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
2caa0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2cab0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
2cac0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2cad0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2cae0 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  er) );.    while
2caf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cb00 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
2cb10 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
2cb20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2cb30 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2cb40 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2cb50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74      rc = pagerSt
2cb60 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67  ress((void*)pPag
2cb70 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  er, pList);.    
2cb80 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20    }.      pList 
2cb90 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = pNext;.    }. 
2cba0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2cbb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2cbc0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2cbd0 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
2cbe0 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
2cbf0 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
2cc00 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
2cc10 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
2cc20 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
2cc30 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
2cc40 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2cc50 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
2cc60 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
2cc70 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
2cc80 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
2cc90 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2cca0 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
2ccb0 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
2ccc0 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
2ccd0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2cce0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
2ccf0 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
2cd00 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
2cd10 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
2cd20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
2cd30 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2cd40 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
2cd50 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
2cd60 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
2cd70 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
2cd80 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
2cd90 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
2cda0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2cdb0 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
2cdc0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2cdd0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
2cde0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2cdf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
2ce00 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
2ce10 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
2ce20 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2ce30 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
2ce40 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
2ce50 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2ce60 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
2ce70 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2ce80 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
2ce90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2cea0 78 74 72 61 28 29 20 41 50 49 2e 20 20 57 68 65  xtra() API.  Whe
2ceb0 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69 73 20  n a new page is 
2cec0 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a  allocated, the.*
2ced0 2a 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  * first 8 bytes 
2cee0 6f 66 20 74 68 69 73 20 73 70 61 63 65 20 61 72  of this space ar
2cef0 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65  e zeroed but the
2cf00 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e   remainder is un
2cf10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20  initialized..** 
2cf20 28 54 68 65 20 65 78 74 72 61 20 73 70 61 63 65  (The extra space
2cf30 20 69 73 20 75 73 65 64 20 62 79 20 62 74 72 65   is used by btre
2cf40 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65  e as the MemPage
2cf50 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20   object.).**.** 
2cf60 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2cf70 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2cf80 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2cf90 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2cfa0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2cfb0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2cfc0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2cfd0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2cfe0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2cff0 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2d000 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2d010 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2d020 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2d030 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2d040 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2d050 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2d060 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2d070 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2d080 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2d090 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2d0a0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2d0b0 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2d0c0 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2d0d0 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2d0e0 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2d0f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2d100 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2d110 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2d120 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2d130 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d140 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2d150 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2d160 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2d170 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2d180 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2d190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2d1a0 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2d1b0 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2d1c0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2d1d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2d1e0 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2d1f0 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2d200 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2d210 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2d220 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2d230 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2d240 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2d250 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2d260 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2d270 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d280 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2d290 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2d2a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2d2b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2d2c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2d2d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2d2e0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2d2f0 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2d300 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2d310 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2d320 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2d330 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2d340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2d350 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2d360 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2d370 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2d380 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2d390 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2d3a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2d3b0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2d3c0 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2d3d0 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2d3e0 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2d3f0 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2d400 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2d410 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2d420 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2d430 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2d440 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2d450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d460 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2d470 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2d480 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2d490 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2d4a0 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2d4b0 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2d4c0 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2d4d0 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2d4e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2d4f0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2d500 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2d510 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2d520 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d530 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2d540 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2d550 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2d560 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2d570 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2d580 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2d590 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2d5a0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2d5b0 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2d5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2d5d0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2d5e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2d5f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2d600 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2d610 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2d620 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2d630 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2d640 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2d650 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2d660 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2d670 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2d680 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2d690 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2d6a0 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2d6b0 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2d6c0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2d6d0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2d6e0 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2d6f0 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2d700 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2d710 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2d720 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2d730 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2d740 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d750 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2d760 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2d770 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2d780 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2d790 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2d7a0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2d7b0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2d7c0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2d7d0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2d7e0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2d7f0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20  -journal).  */. 
2d800 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d810 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2d820 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2d830 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  s));..  /* Set t
2d840 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2d850 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2d860 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2d870 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2d880 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2d890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2d8a0 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2d8b0 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2d8c0 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2d8d0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2d8e0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2d8f0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2d900 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2d910 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2d920 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2d930 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2d940 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d950 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2d960 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2d970 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2d980 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2d990 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2d9a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2d9b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2d9c0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2d9d0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2d9e0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2d9f0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2da00 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2da10 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2da20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2da30 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2da40 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2da50 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2da60 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2da70 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2da80 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2da90 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2daa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2dab0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2dac0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2dad0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2dae0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2daf0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2db00 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2db10 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2db20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2db30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2db40 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2db50 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2db60 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2db70 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2db80 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2db90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2dba0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2dbb0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2dbc0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2dbd0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2dbe0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2dbf0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2dc00 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2dc10 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2dc20 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2dc30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2dc40 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2dc50 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2dc60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2dc70 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2dc80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2dc90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2dca0 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2dcb0 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2dcc0 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2dcd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dce0 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2dcf0 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2dd00 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2dd10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2dd20 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2dd30 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2dd40 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2dd50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2dd60 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2dd70 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2dd80 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2dd90 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2dda0 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2ddb0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2ddc0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2ddd0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2dde0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2ddf0 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2de00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2de10 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2de20 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2de30 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2de40 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2de50 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2de60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2de70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2de80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2de90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2dea0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2deb0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2dec0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2ded0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2dee0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2def0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2df00 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2df10 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2df20 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2df30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2df40 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2df50 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2df60 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2df70 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2df80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2df90 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2dfa0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2dfb0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2dfc0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2dfd0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2dfe0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2dff0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e000 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2e010 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2e020 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2e030 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2e040 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2e050 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2e060 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2e070 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2e080 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2e090 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2e0a0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2e0b0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2e0c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2e0d0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2e0e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2e0f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2e100 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2e110 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2e120 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2e130 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2e140 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2e150 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2e160 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2e170 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2e180 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2e190 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2e1a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2e1b0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2e1c0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2e1d0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2e1e0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2e1f0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2e200 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2e210 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2e220 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2e230 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2e240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2e250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2e260 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2e270 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2e280 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2e290 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2e2a0 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2e2c0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2e2d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2e2e0 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2e2f0 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2e300 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2e310 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2e320 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2e330 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2e340 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2e350 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2e360 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2e370 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2e380 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2e390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e3a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e3b0 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2e3c0 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2e3d0 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2e3e0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2e3f0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2e400 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2e410 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2e420 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2e430 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2e440 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2e450 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2e460 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2e470 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e480 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2e490 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2e4a0 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2e4b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2e4c0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2e4d0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2e4e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2e4f0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2e500 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2e520 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2e530 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2e540 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2e550 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2e560 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2e570 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2e580 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2e590 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2e5a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2e5b0 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2e5c0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2e5d0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2e5e0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2e5f0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2e600 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2e610 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2e620 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2e630 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2e640 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2e650 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2e660 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2e670 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2e680 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2e690 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2e6a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2e6b0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2e6c0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2e6d0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2e6e0 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2e6f0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2e700 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2e710 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2e720 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2e730 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2e740 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2e750 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2e760 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2e770 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2e780 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2e790 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2e7a0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2e7b0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2e7c0 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2e7d0 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2e7e0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2e7f0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2e800 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2e810 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2e820 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2e830 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2e840 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2e850 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2e860 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2e870 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2e880 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2e890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2e8a0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2e8b0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2e8c0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8e0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2e8f0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2e900 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e910 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2e920 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e930 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2e940 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2e950 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2e960 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2e970 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2e980 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2e990 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2e9a0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2e9b0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2e9c0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2e9d0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2e9e0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2e9f0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2ea00 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2ea10 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2ea20 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2ea30 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2ea40 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2ea50 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2ea60 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2ea70 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2ea80 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2ea90 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2eaa0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2eab0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2eac0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2ead0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2eae0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2eaf0 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2eb00 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2eb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2eb20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2eb30 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2eb40 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2eb50 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2eb60 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2eb70 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2eb80 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2eb90 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2eba0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2ebb0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2ebc0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ebd0 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2ebe0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2ebf0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2ec00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ec10 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2ec20 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2ec30 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2ec40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2ec50 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2ec60 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2ec70 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2ec80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec90 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2eca0 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2ecb0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2ecc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ecd0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2ece0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2ecf0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2ed00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2ed10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ed20 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2ed30 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2ed40 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2ed50 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2ed60 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2ed70 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2ed80 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2ed90 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2eda0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2edb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2edc0 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2edd0 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2ede0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2edf0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2ee00 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2ee10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2ee20 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2ee40 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2ee50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ee60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ee70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2ee80 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2ee90 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2eea0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2eeb0 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2eec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2eed0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2eee0 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2eef0 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2ef00 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2ef10 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2ef20 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2ef30 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2ef40 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2ef50 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2ef60 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2ef70 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2ef80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2ef90 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2efa0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2efb0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2efc0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2efd0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2efe0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2eff0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2f000 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2f010 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2f020 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2f030 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2f040 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2f050 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2f060 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2f070 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2f080 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2f090 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2f0a0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2f0b0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2f0c0 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2f0d0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2f0e0 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2f0f0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2f100 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2f110 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2f120 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2f130 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2f140 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2f150 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2f160 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2f170 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2f180 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2f190 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2f1a0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2f1b0 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2f1c0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2f1d0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2f1e0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2f1f0 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2f200 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2f210 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2f220 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2f230 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2f240 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2f250 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2f260 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2f270 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2f280 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2f290 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2f2a0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2f2b0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2f2c0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2f2d0 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2f2e0 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2f2f0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2f300 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2f310 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2f320 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2f330 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2f350 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2f360 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2f370 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2f380 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2f390 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2f3a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2f3b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f3c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2f3d0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2f3e0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2f3f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f400 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   ){.    nExtra =
2f410 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2f420 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78  .    assert( nEx
2f430 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61  tra>=8 && nExtra
2f440 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20  <1000 );.    rc 
2f450 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f  = sqlite3PcacheO
2f460 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2f470 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2f4a0 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2f4b0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2f4c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2f4d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2f4e0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62  rror occurred ab
2f4f0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50  ove, free the  P
2f500 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2f510 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2f520 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2f530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f540 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2f550 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2f560 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
2f570 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
2f580 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  pace);.    sqlit
2f590 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
2f5a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2f5b0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2f5c0 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2f5d0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2f5e0 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2f5f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2f600 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2f610 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2f620 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2f630 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2f640 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2f650 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2f660 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2f670 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2f680 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2f690 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2f6a0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2f6b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f6c0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2f6d0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f6e0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2f6f0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f700 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2f710 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2f720 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2f730 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2f740 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2f750 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2f760 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2f770 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2f780 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f790 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2f7a0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2f7b0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2f7c0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2f7d0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2f7e0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2f7f0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2f800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2f810 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2f820 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2f830 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2f840 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2f850 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2f860 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2f870 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2f880 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2f890 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2f8a0 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2f8b0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2f8c0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2f8d0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2f8e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f8f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2f900 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2f910 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2f920 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2f930 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f940 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2f950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f960 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2f970 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2f980 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  t( pPager->syncF
2f990 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2f9a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77  ssert( pPager->w
2f9b0 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  alSyncFlags==0 )
2f9c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2f9d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2f9e0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2f9f0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
2fa00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2fa10 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2fa20 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2fa30 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2fa40 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2fa50 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c  NC_NORMAL | (SQL
2fa60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c  ITE_SYNC_NORMAL<
2fa70 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  <2);.  }.  /* pP
2fa80 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2fa90 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2faa0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2fab0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fac0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2fad0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2fae0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2faf0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2fb00 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2fb10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2fb20 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2fb30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2fb40 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2fb50 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2fb60 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2fb70 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2fb80 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2fb90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2fba0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2fbb0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2fbc0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2fbd0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2fbe0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2fbf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2fc00 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2fc10 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2fc20 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2fc30 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2fc40 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2fc50 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2fc60 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2fc70 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
2fc80 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  d(pPager);.  /* 
2fc90 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2fca0 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2fcb0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2fcc0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fcd0 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
2fce0 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
2fcf0 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
2fd00 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
2fd10 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2fd20 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2fd30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2fd40 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
2fd50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2fd60 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
2fd70 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
2fd80 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
2fd90 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
2fda0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2fdb0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
2fdc0 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
2fdd0 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
2fde0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
2fdf0 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
2fe00 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
2fe10 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
2fe20 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
2fe30 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2fe40 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
2fe50 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
2fe60 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2fe70 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
2fe80 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
2fe90 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
2fea0 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
2feb0 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
2fec0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
2fed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2fef0 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
2ff00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2ff10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
2ff20 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
2ff30 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
2ff40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2ff50 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
2ff60 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2ff70 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
2ff80 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
2ff90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ffa0 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
2ffb0 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
2ffc0 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
2ffd0 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
2ffe0 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
2fff0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
30000 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
30010 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
30020 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
30030 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
30040 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
30050 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
30060 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
30070 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
30080 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
30090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
300a0 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
300b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
300c0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
300d0 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
300e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
300f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30100 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
30110 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
30120 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
30130 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
30140 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
30150 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
30160 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
30170 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
30180 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
30190 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
301a0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
301b0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
301c0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
301d0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
301e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
301f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
30200 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
30210 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
30220 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
30230 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
30240 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30250 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
30260 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
30270 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
30280 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
30290 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
302a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
302b0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
302c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
302d0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
302e0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
302f0 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
30300 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
30310 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
30320 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
30330 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
30340 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
30350 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
30360 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
30370 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
30380 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
30390 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
303a0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
303b0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
303c0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
303d0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
303e0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
303f0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
30400 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
30410 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
30420 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
30430 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
30440 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
30450 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
30460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
30470 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
30480 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
30490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
304a0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
304b0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
304c0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
304d0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
304e0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
304f0 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
30500 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30510 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
30520 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
30530 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
30540 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
30550 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
30560 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
30570 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
30580 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
30590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
305a0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
305b0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
305c0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
305d0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
305e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
305f0 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
30600 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
30610 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
30620 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
30630 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
30640 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
30650 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
30660 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
30670 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
30680 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30690 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
306a0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
306b0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
306c0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
306d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
306e0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
306f0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
30700 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
30710 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
30720 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
30730 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
30740 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
30750 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
30760 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
30770 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
30780 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
30790 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
307a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
307b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
307c0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
307d0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
307e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
307f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
30800 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
30810 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
30820 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30830 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
30840 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
30850 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
30860 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
30870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30880 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
30890 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
308a0 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
308b0 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
308c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
308d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
308e0 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
308f0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
30900 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
30910 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
30920 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
30930 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
30940 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
30950 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
30960 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
30970 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
30980 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
30990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
309a0 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
309b0 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
309c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
309d0 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
309e0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
309f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
30a00 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
30a10 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
30a20 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
30a30 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
30a40 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
30a50 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
30a60 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
30a70 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
30a80 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
30a90 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
30aa0 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
30ab0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
30ac0 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
30ad0 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
30ae0 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
30af0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
30b00 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
30b10 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
30b20 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
30b30 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
30b40 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
30b50 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
30b60 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
30b70 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
30b80 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
30b90 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
30ba0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
30bb0 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
30bc0 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
30bd0 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
30be0 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
30bf0 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
30c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30c10 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
30c20 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
30c30 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
30c40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30c50 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
30c60 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30c90 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
30ca0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  le */..      ass
30cb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
30cc0 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pFile==0 );.    
30cd0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
30ce0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
30cf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
30d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30d10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
30d20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
30d30 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69  zero pages in si
30d40 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ze, that means t
30d50 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74  hat either (1) t
30d60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
30d70 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61  urnal is a remna
30d80 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  nt from a prior 
30d90 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
30da0 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72  e same name wher
30db0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
30dc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
30dd0 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  ut not the journ
30de0 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20  al was deleted, 
30df0 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69  or (2) the initi
30e00 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  al.        ** tr
30e10 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70  ansaction that p
30e20 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64  opulates a new d
30e30 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67  atabase is being
30e40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
30e50 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68        ** In eith
30e60 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75  er case, the jou
30e70 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65  rnal file can be
30e80 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76   deleted.  Howev
30e90 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20  er, take care.  
30ea0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20        ** not to 
30eb0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
30ec0 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
30ed0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75   already open du
30ee0 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
30ef0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
30f00 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f  SIST..        */
30f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
30f20 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70  ge==0 && !jrnlOp
30f30 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30f40 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
30f50 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
30f60 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
30f70 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
30f80 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
30f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
30fb0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
30fc0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
30fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30fe0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
30ff0 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
31000 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
31010 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
31020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
31040 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
31050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31080 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
31090 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
310a0 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
310b0 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
310c0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
310d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
310e0 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
310f0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
31100 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
31110 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
31120 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
31130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
31140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
31150 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
31160 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
31170 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
31180 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
31190 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
311a0 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
311b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
311c0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
311d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
311e0 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51   int f = .#if SQ
311f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
31200 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
31210 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
31220 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
31230 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
31240 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
31250 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
31260 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
31270 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
31280 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
31290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
312a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
312b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
312c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
312d0 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
312e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
312f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31310 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
31320 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
31330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
31340 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
31350 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
31360 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31380 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
31390 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
313a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
313b0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
313c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
313d0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
313e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
313f0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31400 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31420 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
31430 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
31440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
31450 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
31460 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
31470 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
31480 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
31490 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
314a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
314b0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
314c0 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
314d0 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
314e0 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
314f0 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
31500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
31510 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
31520 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
31530 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
31540 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
31550 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
31560 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
31570 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
31580 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
31590 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
315a0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
315b0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
315c0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
315d0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
315e0 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
315f0 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
31600 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
31610 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
31620 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
31630 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
31640 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
31650 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
31660 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
31670 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
31680 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
31690 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
316a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
316b0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
316c0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
316d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
316e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
316f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31700 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
31710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31720 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
31730 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
31740 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
31750 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31760 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
31770 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
31780 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  ll sqlite3PagerG
31790 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  et() until after
317a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
317b0 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
317c0 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
317d0 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
317e0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
317f0 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
31800 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
31810 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
31820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
31830 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
31840 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
31850 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
31860 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
31870 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
31880 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
31890 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
318a0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
318b0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
318c0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
318d0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
318e0 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
318f0 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
31900 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31910 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
31920 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
31930 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
31940 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
31950 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
31960 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
31970 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
31980 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
31990 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
319a0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
319b0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
319c0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
319d0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
319e0 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
319f0 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
31a00 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
31a10 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
31a20 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
31a30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
31a40 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
31a50 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
31a60 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
31a70 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
31a80 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
31a90 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
31aa0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
31ab0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
31ac0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
31ad0 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
31ae0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
31af0 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
31b00 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
31b10 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
31b20 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
31b30 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
31b40 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
31b50 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
31b60 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
31b70 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
31b80 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
31b90 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
31ba0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
31bb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
31bc0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
31bd0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
31be0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
31bf0 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
31c00 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
31c10 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
31c20 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
31c30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
31c40 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
31c50 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
31c60 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
31c70 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
31c80 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
31c90 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
31ca0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
31cb0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
31cc0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
31cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31ce0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
31cf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
31d00 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
31d10 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
31d20 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
31d30 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
31d40 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
31d50 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
31d60 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
31d70 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
31d80 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
31d90 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
31da0 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
31db0 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
31dc0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
31dd0 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
31de0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
31df0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
31e00 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
31e10 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
31e20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
31e30 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
31e40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31e50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
31e60 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
31e70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31e80 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
31e90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31ea0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
31eb0 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 61  OK );..  if( !pa
31ec0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
31ed0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
31ee0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31ef0 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
31f00 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
31f10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
31f20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
31f30 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
31f40 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
31f50 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
31f60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
31f70 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
31f80 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
31f90 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
31fa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
31fb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
31fc0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31fd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32000 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
32010 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
32020 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
32030 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
32040 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
32050 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
32060 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
32070 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
32080 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
32090 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
320a0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
320b0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
320c0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
320d0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
320e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
320f0 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  >eLock<=SHARED_L
32100 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
32110 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
32120 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75  pPager, &bHotJou
32130 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
32140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
32160 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
32170 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
32180 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
32190 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
321a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
321b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
321c0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
321d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
321e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
321f0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
32200 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
32210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
32220 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
32230 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
32240 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
32250 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
32260 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
32270 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
32280 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
32290 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
322a0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
322b0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
322c0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
322d0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
322e0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
322f0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
32300 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
32310 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
32320 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
32330 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
32340 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
32350 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
32360 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
32370 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
32380 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
32390 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
323a0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
323b0 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
323c0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
323d0 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
323e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
323f0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
32400 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
32410 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
32420 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
32430 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
32440 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
32450 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
32460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32470 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
32480 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
32490 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
324a0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
324b0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
324c0 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
324d0 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
324e0 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
324f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
32500 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
32510 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
32520 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
32530 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
32540 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32560 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32570 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
32580 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
32590 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
325a0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
325b0 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
325c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
325d0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
325e0 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
325f0 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
32600 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
32610 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
32620 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
32630 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
32640 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
32650 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
32660 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
32670 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
32680 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
32690 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
326a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
326b0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
326c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
326d0 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
326e0 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
326f0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
32700 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
32710 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
32720 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
32730 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
32740 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
32750 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
32760 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
32770 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
32780 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
32790 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
327a0 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
327b0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
327c0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
327d0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
327e0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
327f0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
32800 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
32810 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
32820 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
32830 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
32840 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
32850 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
32860 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
32870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
32880 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
32890 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
328a0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
328b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
328c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
328d0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
328e0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
328f0 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
32900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
32910 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
32920 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
32930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32940 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
32950 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
32960 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
32970 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
32980 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
32990 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
329a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
329b0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
329c0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
329d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
329e0 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
329f0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
32a00 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  TION.           
32a10 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61   (pPager->vfsFla
32a20 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  gs&SQLITE_OPEN_F
32a30 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41  ILEPROTECTION_MA
32a40 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20  SK)|.#endif.    
32a50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
32a60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
32a70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32a80 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
32a90 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
32aa0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
32ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32ac0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
32ad0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32ae0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
32af0 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
32b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
32b20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32b30 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
32b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32b50 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
32b60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
32b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
32b80 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
32b90 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
32ba0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
32bb0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
32bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32be0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
32bf0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
32c00 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
32c10 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
32c20 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
32c30 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
32c40 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
32c50 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
32c60 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
32c70 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
32c80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
32c90 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
32ca0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
32cb0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
32cc0 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
32cd0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
32ce0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
32cf0 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
32d00 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
32d10 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
32d20 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
32d30 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
32d40 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
32d50 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
32d60 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
32d70 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
32d80 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
32d90 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
32da0 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
32db0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
32dc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
32de0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
32df0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
32e00 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
32e10 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
32e20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32e50 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
32e60 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  , !pPager->tempF
32e70 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
32e80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
32e90 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
32ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
32eb0 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
32ec0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
32ed0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
32ee0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
32ef0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
32f00 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
32f10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32f20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
32f30 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
32f40 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
32f50 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
32f60 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   to open.       
32f70 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b   ** or roll back
32f80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
32f90 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
32fa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
32fb0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
32fc0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f  ager_unlock() ro
32fd0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
32fe0 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  lled before retu
32ff0 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a  rning to unlock.
33000 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
33010 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f  ile. If the unlo
33020 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  ck attempt fails
33030 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f  , then Pager.eLo
33040 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20  ck must be.     
33050 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b     ** set to UNK
33060 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74  NOWN_LOCK (see t
33070 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
33080 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
33090 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b   .        ** UNK
330a0 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20  NOWN_LOCK above 
330b0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
330c0 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  on). .        **
330d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f  .        ** In o
330e0 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65  rder to get page
330f0 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f  r_unlock() to do
33100 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72   this, set Pager
33110 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20  .eState to.     
33120 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f     ** PAGER_ERRO
33130 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e  R now. This is n
33140 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  ot actually coun
33150 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74  ted as a transit
33160 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
33170 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  o ERROR state in
33180 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72   the state diagr
33190 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  am at the top of
331a0 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20   this file,.    
331b0 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
331c0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61  know that the sa
331d0 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  me call to pager
331e0 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76  _unlock() will v
331f0 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ery.        ** s
33200 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f  hortly transitio
33210 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
33220 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73  ct to the OPEN s
33230 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20  tate. Calling.  
33240 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f        ** assert_
33250 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f  pager_state() wo
33260 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73  uld fail now, as
33270 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
33280 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  e possible.     
33290 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45     ** to be in E
332a0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
332b0 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f  there are zero o
332c0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
332d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65  .        ** refe
332e0 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20  rences..        
332f0 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
33300 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
33310 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
33320 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
33330 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
33340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33350 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
33360 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
33370 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52  ger->eLock==SHAR
33380 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
33390 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
333a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
333b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53   pPager->eLock>S
333c0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
333d0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
333e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
333f0 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d  pFile && pPager-
33400 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
33410 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ck ){.      /* T
33420 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
33430 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
33440 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b  uired then check
33450 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
33460 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33470 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
33480 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
33490 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
334a0 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  ,.      ** flush
334b0 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
334c0 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
334d0 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  ck flag prevents
334e0 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
334f0 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e   ** occurring on
33500 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
33510 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65  access to a file
33520 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61  , in order to sa
33530 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  ve a.      ** si
33540 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79  ngle unnecessary
33550 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
33560 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61   call at the sta
33570 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a  rt-up..      **.
33580 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
33590 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65  e changes are de
335a0 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
335b0 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
335c0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
335d0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
335e0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
335f0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
33600 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
33610 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
33620 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
33630 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
33640 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
33650 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
33660 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
33670 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
33680 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
33690 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
336a0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
336b0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
336c0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
336d0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
336e0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
336f0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
33700 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
33710 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
33720 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
33730 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
33740 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
33750 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
33760 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
33770 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
33780 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
33790 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
337a0 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52  s)];..      IOTR
337b0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
337c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
337d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
337e0 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )));.      rc = 
337f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
33800 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
33810 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33820 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
33830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33860 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
33870 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
33880 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
338a0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
338b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
338c0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
338d0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
338e0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
338f0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
33900 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
33910 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
33920 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
33930 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
33940 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
33950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33960 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
33970 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
33980 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
33990 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
339a0 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
339b0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
339c0 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
339d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
339e0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
339f0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
33a00 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
33a10 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
33a20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
33a30 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
33a40 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
33a50 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
33a60 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
33a70 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
33a80 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
33a90 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
33aa0 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
33ab0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
33ac0 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
33ad0 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
33ae0 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
33af0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
33b00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33b10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33b20 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
33b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33b40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
33b50 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
33b60 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
33b70 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
33b80 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
33b90 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
33ba0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
33bb0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
33bc0 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
33bd0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
33be0 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
33bf0 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
33c00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33c10 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
33c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
33c30 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
33c40 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
33c50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
33c60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33c70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
33c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
33c90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
33ca0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
33cb0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
33cc0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
33cd0 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50  empFile==0 && pP
33ce0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33cf0 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
33d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33d10 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
33d20 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
33d30 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
33d40 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
33d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33d60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
33d70 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
33d80 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
33d90 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
33da0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33db0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
33dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
33dd0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
33de0 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
33df0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
33e00 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d  redLock = 1;.  }
33e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33e20 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
33e30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
33e40 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
33e50 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
33e60 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
33e70 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
33e80 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
33e90 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
33ea0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
33eb0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
33ec0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
33ed0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
33ee0 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
33ef0 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
33f00 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
33f10 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
33f20 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
33f30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
33f40 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
33f50 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
33f60 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
33f70 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c  ager){.  if( sql
33f80 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33f90 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33fa0 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  he)==0 ){.    as
33fb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
33fc0 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20  mapOut==0 ); /* 
33fd0 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69 73  because page1 is
33fe0 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61   never memory ma
33ff0 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65  pped */.    page
34000 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
34010 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
34020 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
34030 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73  e getter methods
34040 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63 71   each try to acq
34050 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
34060 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69   to a.** page wi
34070 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  th page number p
34080 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75  gno. If the requ
34090 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
340a0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
340b0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
340c0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
340d0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
340e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
340f0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64 69  .** There are di
34100 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  fferent implemen
34110 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67  tations of the g
34120 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70  etter method dep
34130 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ending.** on the
34140 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
34150 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  f the pager..**.
34160 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f  **     getPageNo
34170 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d  rmal()         -
34180 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65  -  The normal ge
34190 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50  tter.**     getP
341a0 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20 20  ageError()      
341b0 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20      --  Used if 
341c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
341d0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  an error state.*
341e0 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61  *     getPageMma
341f0 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d  p()           --
34200 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79    Used if memory
34210 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65  -mapped I/O is e
34220 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20  nabled.**.** If 
34230 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
34240 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
34250 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
34260 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
34270 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
34280 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
34290 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
342a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
342b0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
342c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
342d0 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
342e0 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
342f0 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
34300 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
34310 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
34320 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
34330 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
34340 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
34350 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
34360 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
34370 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
34380 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
34390 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
343a0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
343b0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
343c0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
343d0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
343e0 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
343f0 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
34400 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
34410 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34420 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
34430 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
34440 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
34450 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
34460 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
34470 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
34480 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
34490 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
344a0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
344b0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
344c0 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70   .** the flags p
344d0 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
344e0 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  s the PAGER_GET_
344f0 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e  NOCONTENT bit an
34500 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
34510 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
34520 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
34530 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
34540 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
34550 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
34560 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
34570 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
34580 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
34590 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
345a0 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
345b0 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54  .** If PAGER_GET
345c0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72  _NOCONTENT is tr
345d0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
345e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
345f0 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
34600 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
34610 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
34620 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
34630 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
34640 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
34650 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
34660 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34670 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
34680 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
34690 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
346a0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
346b0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
346c0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
346d0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
346e0 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
346f0 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
34700 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
34710 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
34720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52  ..**.** If PAGER
34730 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34740 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
34750 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
34760 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
34770 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61  .** of being rea
34780 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
34790 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
347a0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
347b0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
347c0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
347d0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
347e0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
347f0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
34800 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
34810 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
34820 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
34830 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
34840 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
34850 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
34860 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
34870 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
34880 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
34890 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
348a0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
348b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
348c0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
348d0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
348e0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
348f0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
34900 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
34910 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
34920 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
34930 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
34940 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
34950 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
34960 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
34970 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
34980 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
34990 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
349a0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
349b0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
349c0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
349d0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
349e0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
349f0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
34a00 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
34a10 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
34a20 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
34a30 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
34a40 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
34a50 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
34a60 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
34a70 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
34a80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
34a90 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
34aa0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
34ab0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
34ac0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
34ad0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
34ae0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
34af0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
34b00 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
34b10 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
34b20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
34b30 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
34b40 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
34b50 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74  nal files..*/.st
34b60 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
34b70 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20  Normal(.  Pager 
34b80 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
34b90 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
34ba0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34bb0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
34bc0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
34bd0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
34be0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
34bf0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
34c00 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
34c10 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
34c20 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
34c30 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
34c40 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
34c50 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  gs */.){.  int r
34c60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34c70 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75   PgHdr *pPg;.  u
34c80 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20  8 noContent;    
34c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34ca0 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52 5f  * True if PAGER_
34cb0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
34cc0 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65   set */.  sqlite
34cd0 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
34ce0 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Base;..  assert(
34cf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
34d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
34d10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34d20 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
34d30 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
34d40 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34d50 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34d60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34d70 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
34d80 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  Lock==1 );..  if
34d90 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  ( pgno==0 ) retu
34da0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34db0 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20  T_BKPT;.  pBase 
34dc0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34dd0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
34de0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  ache, pgno, 3);.
34df0 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34e00 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
34e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34e20 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73  cacheFetchStress
34e30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34e40 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b  , pgno, &pBase);
34e50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34e60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34e70 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34e80 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d  .    if( pBase==
34e90 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
34ea0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
34eb0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
34ec0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67  .    }.  }.  pPg
34ee0 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c   = *ppPage = sql
34ef0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34f00 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34f10 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61  Cache, pgno, pBa
34f20 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
34f30 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b  Pg==(*ppPage) );
34f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34f50 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
34f60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
34f70 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70  ger==pPager || p
34f80 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  Pg->pPager==0 );
34f90 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20  ..  noContent = 
34fa0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
34fb0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30  ET_NOCONTENT)!=0
34fc0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61  ;.  if( pPg->pPa
34fd0 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34fe0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
34ff0 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
35000 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
35010 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
35020 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
35030 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
35040 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
35050 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
35060 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
35070 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
35080 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
35090 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
350a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
350b0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
350c0 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
350d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
350e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
350f0 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
35100 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
35110 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
35120 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
35130 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
35140 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20   But first some 
35150 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20  error checks:.  
35160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20    **.    ** (1) 
35170 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
35180 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a   number is 2^31.
35190 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72      ** (2) Never
351a0 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74 68   try to fetch th
351b0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20  e locking page. 
351c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
351d0 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
351e0 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
351f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
35200 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
35210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35220 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
35230 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
35250 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
35260 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
35270 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
35280 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  fd) || !MEMDB );
35290 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
352a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
352b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
352c0 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
352d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
352e0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
352f0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
35300 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
35310 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
35320 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35340 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
35350 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
35360 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
35370 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
35380 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
35390 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
353a0 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
353b0 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
353c0 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
353d0 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
353e0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
353f0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
35400 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
35410 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
35420 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
35430 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
35440 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
35450 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
35460 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
35470 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
35480 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
35490 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
354a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
354b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
354c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
354d0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
354e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
354f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
35500 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
35510 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
35520 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
35530 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
35540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35550 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
35560 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
35570 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
35580 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
35590 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
355a0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
355b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
355c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
355d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
355e0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
355f0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
35600 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
35610 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
35620 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
35630 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
35640 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
35650 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
35660 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
35670 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
35680 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
35690 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
356a0 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
356b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
356c0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
356d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
356e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
356f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35700 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35710 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
35720 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
35730 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
35740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
35750 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
35760 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35770 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
35780 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
35790 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
357a0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
357b0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
357c0 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65  ager);.  *ppPage
357d0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
357e0 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  c;.}..#if SQLITE
357f0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
35800 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
35810 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d  ter for when mem
35820 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
35830 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61  s enabled */.sta
35840 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d  tic int getPageM
35850 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Map(.  Pager *pP
35860 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
35870 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
35880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35890 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
358a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
358b0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
358c0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
358d0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
358e0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
358f0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
35900 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
35910 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
35920 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
35930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
35940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
35950 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
35960 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
35970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35980 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64  /* Frame to read
35990 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a   from WAL file *
359a0 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  /..  /* It is ac
359b0 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
359c0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
359d0 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
359e0 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
359f0 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
35a00 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
35a10 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
35a20 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
35a30 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
35a40 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
35a50 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
35a60 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
35a70 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
35a80 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
35a90 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35aa0 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
35ab0 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67  nt bMmapOk = (pg
35ac0 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67  no>1.   && (pPag
35ad0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35ae0 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
35af0 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
35b00 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a  EADONLY)).  );..
35b10 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54    assert( USEFET
35b20 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69  CH(pPager) );.#i
35b30 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
35b40 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20  CODEC.  assert( 
35b50 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
35b60 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  0 );.#endif..  /
35b70 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e  * Optimization n
35b80 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65  ote:  Adding the
35b90 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20   "pgno<=1" term 
35ba0 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22  before "pgno==0"
35bb0 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77   here.  ** allow
35bc0 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f  s the compiler o
35bd0 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73  ptimizer to reus
35be0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
35bf0 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20   the "pgno>1".  
35c00 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70  ** test in the p
35c10 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e  revious statemen
35c20 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73  t, and avoid tes
35c30 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20  ting pgno==0 in 
35c40 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20  the.  ** common 
35c50 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20  case where pgno 
35c60 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69  is large. */.  i
35c70 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67  f( pgno<=1 && pg
35c80 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
35c90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35ca0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
35cb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35cc0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
35cd0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
35ce0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35cf0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35d00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35d10 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
35d20 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
35d30 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
35d40 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
35d50 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20  ..  if( bMmapOk 
35d60 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
35d70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
35d80 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
35d90 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
35da0 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
35db0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
35dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35dd0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
35de0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
35df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
35e00 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
35e10 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f  ame==0 ){.    vo
35e20 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  id *pData = 0;. 
35e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
35e40 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  sFetch(pPager->f
35e50 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34  d, .        (i64
35e60 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
35e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
35e80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
35e90 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20  &pData.    );.  
35ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35eb0 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
35ec0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
35ed0 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52  ->eState>PAGER_R
35ee0 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d  EADER || pPager-
35ef0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
35f00 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
35f10 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
35f20 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
35f30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
35f40 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
35f50 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
35f60 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72  reMapPage(pPager
35f70 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26  , pgno, pData, &
35f80 70 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65  pPg);.     }else
35f90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35fa0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
35fb0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
35fc0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
35fd0 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
35fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35ff0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
36000 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36010 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
36020 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
36030 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
36050 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
36060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36070 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
36080 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
36090 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
360a0 20 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e   return getPageN
360b0 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67  ormal(pPager, pg
360c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
360d0 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  s);.}.#endif /* 
360e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
360f0 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68  SIZE>0 */../* Th
36100 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65  e page getter me
36110 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68  thod for when th
36120 65 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72  e pager is an er
36130 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61  ror state */.sta
36140 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45  tic int getPageE
36150 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70  rror(.  Pager *p
36160 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
36170 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
36180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36190 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
361a0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
361b0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
361c0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
361d0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
361e0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
361f0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
36200 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
36210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
36220 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
36230 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
36240 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b  PARAMETER(pgno);
36250 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36260 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73  TER(flags);.  as
36270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
36280 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
36290 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
362a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
362b0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  er->errCode;.}..
362c0 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c  ./* Dispatch all
362d0 20 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75   page fetch requ
362e0 65 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72  ests to the appr
362f0 6f 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d  opriate getter m
36300 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ethod..*/.int sq
36310 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
36320 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
36330 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
36340 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
36350 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
36360 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
36370 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36380 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
36390 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
363a0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
363b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
363c0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
363d0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
363e0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
363f0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
36400 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
36410 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  >xGet(pPager, pg
36420 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
36430 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  s);.}../*.** Acq
36440 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
36450 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
36460 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
36470 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
36480 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
36490 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
364a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
364b0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
364c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
364d0 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
364e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
364f0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
36500 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
36510 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
36520 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
36530 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
36540 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
36550 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
36560 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
36570 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
36580 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
36590 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
365a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
365b0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
365c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
365d0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
365e0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
365f0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
36600 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
36610 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
36620 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
36630 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
36640 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
36650 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
36660 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
36670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
36680 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
36690 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
366a0 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
366b0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
366c0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
366d0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
366e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
366f0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
36700 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
36710 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
36720 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
36730 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
36740 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
36750 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
36760 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
36770 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
36780 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
36790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  e..**.** The sql
367a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
367b0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
367c0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20  rUnrefNotNull() 
367d0 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75  may only be.** u
367e0 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74  sed if we know t
367f0 68 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69  hat the page bei
36800 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e  ng released is n
36810 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  ot the last page
36820 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c  ..** The btree l
36830 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64  ayer always hold
36840 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74  s page1 open unt
36850 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74  il the end, so t
36860 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f  hese first.** to
36870 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65   routines can be
36880 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65   used to release
36890 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20   any page other 
368a0 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50  than BtShared.pP
368b0 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  age1..**.** Use 
368c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
368d0 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65  fPageOne() to re
368e0 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68  lease page1.  Th
368f0 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e  is latter routin
36900 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20  e.** checks the 
36910 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
36920 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
36930 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d  s and if the num
36940 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20  ber of.** pages 
36950 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20  reaches zero it 
36960 64 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61  drops the databa
36970 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  se lock..*/.void
36980 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36990 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
369a0 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e   *pPg){.  TESTON
369b0 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65  LY( Pager *pPage
369c0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
369d0 20 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   ).  assert( pPg
369e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67  !=0 );.  if( pPg
369f0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
36a00 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65  MMAP ){.    asse
36a10 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31  rt( pPg->pgno!=1
36a20 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73   );  /* Page1 is
36a30 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61   never memory ma
36a40 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65  pped */.    page
36a50 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
36a60 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
36a70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36a80 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
36a90 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73  }.  /* Do not us
36aa0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
36ab0 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61  o release the la
36ac0 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
36ad0 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72  page1 */.  asser
36ae0 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
36af0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
36b00 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d  >pPCache)>0 );.}
36b10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36b20 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
36b30 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
36b40 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
36b50 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
36b60 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
36b70 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65  agerUnrefPageOne
36b80 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
36b90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
36ba0 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
36bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36bc0 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  g->pgno==1 );.  
36bd0 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
36be0 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
36bf0 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31  )==0 ); /* Page1
36c00 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
36c10 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61   mapped */.  pPa
36c20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36c30 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  r;.  sqlite3Pcac
36c40 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
36c50 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
36c60 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
36c70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
36c80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
36c90 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
36ca0 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
36cb0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
36cc0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
36cd0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
36ce0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
36cf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
36d00 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
36d10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
36d20 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
36d30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36d40 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
36d50 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
36d60 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
36d70 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
36d80 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
36d90 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
36da0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
36db0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
36dc0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
36dd0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
36de0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
36df0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
36e00 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
36e10 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
36e20 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
36e30 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
36e40 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
36e50 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
36e60 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
36e70 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
36e80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
36e90 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
36ea0 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
36eb0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
36ec0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
36ed0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
36ee0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
36ef0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
36f00 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
36f10 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
36f20 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
36f30 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
36f40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
36f50 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
36f60 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
36f70 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
36f80 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
36f90 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
36fa0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
36fb0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
36fc0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
36fd0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
36fe0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
36ff0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
37000 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
37010 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
37020 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
37030 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
37040 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
37050 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
37060 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
37070 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
37080 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
37090 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
370a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
370b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
370c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
370d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
370e0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
370f0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
37100 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
37110 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
37120 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
37130 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37140 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37150 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
37160 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
37170 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
37180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37190 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
371a0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
371b0 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
371c0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
371d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
371e0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
371f0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
37200 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
37210 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
37220 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
37230 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
37240 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
37250 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
37260 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
37270 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
37280 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
37290 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
372a0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
372b0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
372c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
372d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
372e0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
372f0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
37300 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
37310 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
37320 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
37330 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
37340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
37350 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
37360 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
37370 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
37380 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
37390 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
373a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
373b0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
373c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
373d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
373e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
373f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37400 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
37410 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
37420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37430 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51    int flags = SQ
37440 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
37450 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
37460 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20  CREATE;.        
37470 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 23 69 66  int nSpill;..#if
37480 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
37490 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
374a0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
374b0 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
374c0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
374d0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
374e0 4b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K);.#endif.     
374f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
37500 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
37510 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
37520 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
37530 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
37540 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
37550 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  L);.          nS
37560 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
37570 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
37580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37590 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
375a0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  |= SQLITE_OPEN_M
375b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
375c0 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
375d0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
375e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
375f0 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  }.          .   
37600 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
37610 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
37620 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
37630 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
37640 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
37650 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
37660 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
37670 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
37680 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
37690 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
376a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
376b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
376c0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
376d0 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20  alOpen (.       
376e0 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
376f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
37700 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
37710 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20  s, nSpill.      
37720 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
37730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
37740 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
37750 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
37760 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
37770 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
37780 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
37790 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
377a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
377b0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
377c0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
377d0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
377e0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
377f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37800 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
37810 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
37820 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
37830 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
37840 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
37850 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
37860 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37870 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
37880 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
37890 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
378a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
378b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
378c0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
378d0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
378e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
378f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
37900 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
37910 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37920 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
37930 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
37940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
37950 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37960 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37970 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
37980 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
37990 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
379a0 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
379b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
379c0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
379d0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
379e0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
379f0 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
37a00 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
37a10 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37a20 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
37a30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
37a40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
37a50 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
37a60 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
37a70 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
37a80 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
37a90 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
37aa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37ab0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
37ac0 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
37ad0 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
37ae0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
37af0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
37b00 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
37b10 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
37b20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
37b30 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
37b40 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
37b50 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
37b60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
37b70 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
37b80 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
37b90 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
37ba0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
37bb0 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
37bc0 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
37bd0 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
37be0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
37bf0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
37c00 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
37c10 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
37c20 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
37c30 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
37c40 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
37c50 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
37c60 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
37c70 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
37c80 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
37c90 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37ca0 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
37cb0 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
37cc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
37cd0 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
37ce0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
37cf0 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
37d00 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
37d10 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
37d20 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
37d30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
37d40 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
37d50 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
37d60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37d70 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
37d80 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
37d90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
37da0 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
37db0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
37dc0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
37dd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
37de0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
37df0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
37e00 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
37e10 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
37e20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
37e30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
37e40 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
37e50 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
37e60 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
37e70 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
37e80 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37e90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
37ea0 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
37eb0 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
37ec0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
37ed0 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
37ee0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
37ef0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
37f00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
37f10 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
37f20 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
37f30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
37f40 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
37f50 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
37f60 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
37f70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
37f80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
37f90 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
37fa0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
37fb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37fd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37ff0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
38000 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
38010 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
38020 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
38030 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
38040 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
38050 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
38060 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
38070 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
38080 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
38090 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
380a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
380b0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
380c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
380d0 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
380e0 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
380f0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
38100 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
38110 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
38120 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
38130 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
38140 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
38150 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
38160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
38170 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
38180 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
38190 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
381a0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
381b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
381c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
381d0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
381e0 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
381f0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
38200 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
38210 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
38220 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
38230 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
38240 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
38250 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
38260 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
38270 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
38280 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
38290 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
382a0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
382b0 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
382c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
382d0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
382e0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
382f0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
38300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
38310 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
38320 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
38330 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
38340 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
38350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
38360 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
38370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38380 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
38390 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
383a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
383b0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
383c0 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
383d0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
383e0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
383f0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
38400 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
38410 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
38420 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
38430 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
38440 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
38450 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
38460 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
38470 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
38480 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
38490 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
384a0 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
384b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
384c0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
384d0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
384e0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
384f0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
38500 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
38510 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
38520 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
38530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
38540 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
38550 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
38560 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
38570 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
38580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
38590 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
385a0 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
385b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
385c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
385d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
385e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
385f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
38600 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
38610 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
38620 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
38630 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
38640 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
38650 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
38660 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
38670 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
38680 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
38690 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
386a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
386b0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
386c0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
386d0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
386e0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
386f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
38700 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
38710 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto th